Navigation 可以更加方便的使用 Fragment,使用过程非常简单,下面看一下使用方法
1,导入依赖
implementation 'android.arch.navigation:navigation-fragment:1.0.0' implementation 'android.arch.navigation:navigation-ui:1.0.0' androidTestImplementation 'android.arch.navigation:navigation-testing:1.0.0-alpha08'
2,在Res 目录下 创建 navigation 文件夹,然后创建 nav_graph.xml
3,在这个xml 文件中 选择自己的 fragment
需要指定从那个 fragment 开始的话就直接 选中某个视图 然后右击 点击 Set as Start Destination 这个项目就可以将这个设置为 最开始的fragment,然后通过连线的方式确定他启动的是哪一个fragment
4,在 Activity 中引用
有两种方式进行引用,修改 Activity 的布局如下所示:
<?xml version="1.0" encoding="utf-8"?> <androidx.appcompat.widget.LinearLayoutCompat 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" android:orientation="vertical" tools:context=".mvp.base.BaseActivity"> <!-- name 是NavHostFragment,他实现了NavHost,这是一个用于放置管理的 destination 的空视图 --> <!-- defaultNavHost 表示NavHostFragment 可以拦截处理返回键 --> <!-- navGraph 用于将这个 NavHostFragment 和 nav_graph.xml 关联起来 --> <fragment android:id="@+id/nav_fragment" android:name="androidx.navigation.fragment.NavHostFragment" android:layout_width="match_parent" android:layout_height="match_parent" app:defaultNavHost="true" app:navGraph="@navigation/nav_graph"/> </androidx.appcompat.widget.LinearLayoutCompat>
通过上面这种方式就可以 显示第一个fragment 了。
还有一种方式,如下:
<androidx.appcompat.widget.LinearLayoutCompat 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" android:orientation="vertical" tools:context=".mvp.base.BaseActivity"> <FrameLayout android:id="@+id/frame_layout" android:layout_width="match_parent" android:layout_height="match_parent" /> </androidx.appcompat.widget.LinearLayoutCompat>
还需要在代码中进行如下修改:
//找到xml 文件 NavHostFragment navHost = NavHostFragment.create(R.navigation.nav_graph); getSupportFragmentManager() .beginTransaction() .replace(R.id.frame_layout,navHost) // 相等于 xml 中的 app:defaultNavHost="true" .setPrimaryNavigationFragment(navHost) .commit();
即可完成加载
5,碎片之间的跳转 和 回退栈
在 nav_graph.xml 中将 fragment 连接好以后 就可以使用 Navigation 自带的方法进行跳转了,并且在跳转的使用可以在nav_graph.xml 中设置跳转的动画。fragment 直接跳转的方法 如下 :
// id 为nav_graph.xml 中 fragment 内 action 的id ,就是需要跳转掉指定fragment的 id fragment基本跳转 A->B Navigation.findNavController(rootView).navigate(id); fragment 携带数据跳转-Bundle A->B Navigation.findNavController(rootView).navigate(id, bundle);
跳转方法,多级跳转 A->B->C,C->A,避免Navigation 跳转后重新执行生命周期方法
注意:这里的id 为 需要回退到指定fragment的 id,并非action,不需要再 xml 中进行连线。
第二个参数 为false 表示 退栈不包括指定的id,否则会将 id 的那个fragment 也退掉
avigation.findNavController(rootView).popBackStack(id, false); //如果退栈一次就返回 true
退栈方法
Navigation.findNavController(rootView).navigateUp();
6,生命周期
通过 Navigation 进行跳转后,原来 fragment 的生命周期会走到那一步呢?如下:
A —> B
从 A 到 B ,则A的生命周期执行到 onDestroyView() ,这个方法的作用就是销毁 fragment 的有关视图 但是依然可以通过 onCreateView() 方法进行重写创建视图。
在跳到 B 后,如果点击了 返回,则 A 就会通过 onCreateView() 重新创建视图。这时 B 就会 执行 onDestory()。
有关视图 但是依然可以通过 onCreateView() 方法进行重写创建视图。
在跳到 B 后,如果点击了 返回,则 A 就会通过 onCreateView() 重新创建视图。这时 B 就会 执行 onDestory()。
以上就是 Navigation 的用法,是不是非常简单呢?