Navigation 组件旨在用于具有一个主 Activity 和多个 Fragment 目的地的应用。主 Activity 与导航图相关联,且包含一个负责根据需要交换目的地的
NavHostFragment
。
Navigation提供了便于使用的Fragment跳转功能
大于等于 Android Studio 3.3
implementation 'androidx.navigation:navigation-fragment:2.3.5' implementation 'androidx.navigation:navigation-ui:2.3.5'
<fragment android:id="@+id/main" android:name="androidx.navigation.fragment.NavHostFragment" android:layout_width="0dp" android:layout_height="0dp" app:defaultNavHost="false" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintLeft_toLeftOf="parent" app:layout_constraintRight_toRightOf="parent" app:layout_constraintTop_toTopOf="parent" app:navGraph="@navigation/nav_graph" />
关注3个地方:
1. android:name="androidx.navigation.fragment.NavHostFragment",需要使用NavHostFragment 2. app:defaultNavHost="false"是否拦截Back案件 3. app:navGraph="@navigation/nav_graph" 指定导航图
<?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/nav_graph" app:startDestination="@id/HomeFragment"> <fragment android:id="@+id/HomeFragment" android:name="com.motern.cherry.monitor.views.fragments.HomeFragment" tools:layout="@layout/fragment_home"> <action android:id="@+id/action_HomeFragment_to_AdminFragment" app:destination="@id/AdminFragment" /> </fragment> <fragment android:id="@+id/AdminFragment" android:name="com.motern.cherry.monitor.views.fragments.AdminFragment" tools:layout="@layout/fragment_admin"> <action android:id="@+id/action_AdminFragment_to_HomeFragment" app:destination="@id/HomeFragment" /> </fragment> </navigation>
关注以下部分:
NavHostFragment.findNavController(Fragment) Navigation.findNavController(Activity, @IdRes int viewId) Navigation.findNavController(View)
区别:最终都是通过Navigation.findNavController(View)获取,前两个提供便利的使用方法
NavController.navigate(@IdRes int resId)
此处传递导航图中定义的action_id
NavController.navigate(@IdRes int resId, @Nullable Bundle args)
或者通过Safe Args插件进行参数传递。
这里的mNavigatorProvider是一个什么呢?通过观察发现内部是一个map,维护了Navigator
4. navigate():这是controller对外提供的fragment跳转方法,重载了非常多次,最终发现调用了Navigator的
原来通过XmlParser进行解析,最终转换成java实体NavGraph