Jetpack中Navigation的使用

什么是Navigation

Navigation 是一个框架,用于在 Android 应用中的“目标”之间导航。通俗来讲就是用于一个主Activity上多个Fragment页面的跳转。如果是比较简单的应用完全可以只用一个Activity和多个Fragment实现需要的功能。

navigation由以下三个关键部分组成:

  1. 导航图:在一个集中位置包含所有导航相关信息的 XML 资源。这包括应用内所有单个内容区域(称为目标)以及用户可以通过应用获取的可能路径。
  2. NavHost:显示导航图中目标的空白容器。导航组件包含一个默认 NavHost 实现 (NavHostFragment),可显示 Fragment 目标。
  3. NavController:在 NavHost 中管理应用导航的对象。当用户在整个应用中移动时,NavController 会安排 NavHost 中目标内容的交换。

提供各种其他优势,包括以下内容:

  1. 处理 Fragment 事务。
  2. 默认情况下,正确处理往返操作。
  3. 为动画和转换提供标准化资源。
  4. 实现和处理深层链接。
  5. 包括导航界面模式(例如抽屉式导航栏和底部导航),用户只需完成极少的额外工作。
  6. Safe Args - 可在目标之间导航和传递数据时提供类型安全的 Gradle 插件。
  7. ViewModel 支持 - 您可以将 ViewModel 的范围限定为导航图,以在图表的目标之间共享与界面相关的数据。

Navigation的使用

第一步:添加依赖

dependencies {
  def nav_version = "2.3.5"
  // Java language implementation
  implementation "androidx.navigation:navigation-fragment:$nav_version"
  implementation "androidx.navigation:navigation-ui:$nav_version"

  // Kotlin
  implementation "androidx.navigation:navigation-fragment-ktx:$nav_version"
  implementation "androidx.navigation:navigation-ui-ktx:$nav_version"
}

第二步:找到资源文件res目录,鼠标右键选择new -> Android Resource File,Resource type选择Navigation,输入自己的xml文件名,点击ok,as会自动生成navigation文件夹,并且在这个文件夹下生成你命名的xml文件。这个文件里面就是用来管理fragment的跳转指向和跳转动画。

第三步:可以把xml切换成Design模式,这个模式可以是可操作界面,可以节省写代码的操作。

  1. 点击左上角add图标,会有一个列表,列表中展示的是已经创建过的fragment布局名称,如果没有创建也可以点击placeholder去创建。添加的第一个fragment会被设置成默认的页面,左侧界面会展示它的id名称,后面有Start标识的就是默认页面。
  2. 拖动页面右侧蓝色小圆点到另外一个页面上,会生成一个带有箭头的线,这个线就是一个action,表示当前页面可以跳转到箭头指向的页面。每一个action都有对应的id,可以通过R.id.去访问。
<?xml version="1.0" encoding="utf-8"?>
<navigation xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/my_navigation"
    app:startDestination="@id/homeFragment">
    <fragment
        android:id="@+id/homeFragment"
        android:name="com.example.navigationdemo.HomeFragment"
        android:label="fragment_home"
        tools:layout="@layout/fragment_home" >
        <action
            android:id="@+id/next_action"
            app:destination="@id/secondFragment" />
    </fragment>
    <fragment
        android:id="@+id/secondFragment"
        android:name="com.example.navigationdemo.SecondFragment"
        android:label="fragment_second"
        tools:layout="@layout/fragment_second" />
</navigation>

效果图就是这个样子,由于家里的电脑as不知道为什么不能预览效果,所以网上找了一个图来。。。。
Jetpack中Navigation的使用_第1张图片
第四步:navigation文件写好之后,要把它添加到activity布局中去,这样这个文件才会有效。下面代码中的navGraph属性指向的就是navigation布局。

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <androidx.fragment.app.FragmentContainerView
        android:id="@+id/fragmentContainerView"
        android:name="androidx.navigation.fragment.NavHostFragment"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        app:defaultNavHost="true"
        app:navGraph="@navigation/my_navigation" />
</androidx.constraintlayout.widget.ConstraintLayout>

第五步:布局也加载进去了,那它的跳转怎么去实现了,比如说我这里写了一个点击事件,点击之后从home页面跳转到第二个页面。它的代码实现是非常简单的:

  1. kotlin用法 findNavController().navigate(R.id.action_homeFragment_to_secondFragment),下面代码都使用kotlin实现。
  2. Java用法 Navigation.findNavController(v).navigate(R.id.action_homeFragment_to_secondFragment)

如果要从上一个页面返回的话使用:点击事件可以直接传Navigation.createNavigateOnClickListener(R.id.action_homeFragment_to_secondFragment)进去就行。如果是其他的方式可以使用 findNavController().popBackStack() 或者 findNavController().navigateUp()实现。

两者有什么区别呢?
navigateUp向上返回的功能其实也是调用popBackStack的。 但是,navigateUp的源码里多了一层判断,源码如下:就是判断这个Navigation是否是最后一个Fragment,并且这个Navigation与里面的Fragment是不是有可能是其他Navigation跳转过来的。如果是其他Navigation跳转过来的就会回到之前的Navigation上。并且销毁当前Navigation的Activity。

第六步:上面navigation的简单使用已经完成了,但是页面跳转经常会传递一些参数,那navigation怎么传递参数呢?其实它的navigate方法除了一个id参数的,还有一个两种参数的方法,第一个参数依然是id,第二个参数是Bundle类型,这个参数就是用来传递数据的。

上面第二步说到navigation文件还可以设置页面跳转的动画,实现方式是编写动画xml文件,然后把动画xml添加到action标签中的动画属性中。enterAnim 和 exitAnim 是去往栈里添加一个 destination 时两个 destination 的动画,popEnterAnim 和 popExitAnim 是从栈里移除一个 destination 时的动画。

更多详细的用法可以在谷歌官方文档查看:官方文档传送门

你可能感兴趣的:(android,android)