Navigation组件使用
1.通过Activity的xml布局文件中创建一个fragment
<fragment
android:id="@+id/my_nav_host_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" />
-
nav_graph
需要手动创建Android studio中鼠标选中app目录(焦点需要在app目录上,不然不显示Android Resource File)
File -> New -> Android Resource File
File name
自己命名Resource type
选项需要选择Navigation,直接点击ok -
NavHostFragment
是系统文件需要,不需要自己手动创建
2.xml中navGraph文件属性需要配置
- Create new destination,创建新的fragment
- 如果多个fragment中存在跳转关系,通过鼠标用箭头关联
其中fragment跳转时过度动画添加有两种方式
-
代码中添加
val options = navOptions { anim { enter = R.anim.slide_in_right exit = R.anim.slide_out_left popEnter = R.anim.slide_in_left popExit = R.anim.slide_out_right } } //fragment跳转时,传入options findNavController().navigate(R.id.flow_step_one_dest, null, options)
-
通过xml文件中的action添加,也可鼠标点选action指向的线段,在Design中进行动画的选择
<fragment android:id="@+id/fragmentA" android:name="com.clant.jetpack.FragmentA" android:label="fragment_a" tools:layout="@layout/fragment_a"> <action android:id="@+id/action_fragmentA_to_fragmentB" app:destination="@id/fragmentB" app:enterAnim="@anim/slide_in_right" app:exitAnim="@anim/slide_out_left" app:popEnterAnim="@anim/slide_in_left" app:popExitAnim="@anim/slide_out_right" /> </fragment>
代码中,调用以下代码才有过度动画
//java NavController navController = Navigation.findNavController(getActivity(), R.id.nav_host_fragment); navController.navigate(R.id.action_thirdFragment_to_firstFragment2); //kotlin activity?.let { it1 -> Navigation.findNavController(it1, R.id.my_nav_host_fragment) .navigate(R.id.action_fragmentA_to_fragmentB) }
fragment中没有动画直接跳转
findNavController().navigate(R.id.fragmentC)
Navigation引入问题:
在通过Navigation每次打开新的页面返回时,fragment并没有缓存,所以每次返回之前的fragment的时候都需要重新创建走onCreateView,解决方式网上多数都是通过替换文件,将replace改成hide的方式,不理解官方为什么如此实现Navigation,鼓励ViewModel实现缓存相关功能?
本篇文章中有关Navigation没有涉及到的内容:
使用菜单,抽屉和底部导航进行导航
Navigation 的fragment跳转传值问题
深度链接(Deep Linking to a destination)
将Web链接与目标关联(Associating a web link with a destination)