Navigation 的关键概念
1、Navigation Graph: 定义了应用内的所有导航目的地以及它们之间的连接。
2、NavHost: 一个 UI 元素,用于承载当前的导航目的地。
3、NavController: 管理目的地之间的导航。
4、Destination: 导航图中的一个节点,用户导航到该节点时,宿主会显示其内容。
5、Route: 用于导航的唯一标识符,可以是任何可序列化的数据类型
如何使用 Navigation
1、添加依赖:
在项目的 build.gradle 文件中添加 Navigation 组件的依赖
java
implementation "androidx.navigation:navigation-fragment:$nav_version"
implementation "androidx.navigation:navigation-ui:$nav_version"
2、创建导航图:
在 res 目录下创建一个新的导航目录,然后创建一个导航资源文件(例如 nav_graph.xml)。
3、配置导航图:
在导航图 XML 文件中添加 fragment 标签来定义目的地,并使用 action 标签定义它们之间的导航操作。
java
<navigation xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/nav_graph">
<fragment
android:id="@+id/homeFragment"
android:name="com.example.HomeFragment"
android:label="Home">
<action
android:id="@+id/action_homeFragment_to_detailsFragment"
app:destination="@id/detailsFragment" />
</fragment>
<fragment
android:id="@+id/detailsFragment"
android:name="com.example.DetailsFragment"
android:label="Details" />
</navigation>
4、在 Activity 中设置 NavHost:
在 Activity 的布局文件中添加 NavHostFragment,并将其与导航图关联。
java
<fragment
android:id="@+id/nav_host_fragment"
android:name="androidx.navigation.fragment.NavHostFragment"
android:layout_width="match_parent"
android:layout_height="match_parent"
app:navGraph="@navigation/nav_graph" />
5、导航到目的地:
使用 NavController 进行导航。
kotlin
val navController = findNavController(R.id.nav_host_fragment)
navController.navigate(R.id.action_homeFragment_to_detailsFragment)
6、传递参数:
可以通过 Bundle 传递参数。
kotlin
val bundle = Bundle().apply {
putString("KEY", "value")
}
navController.navigate(R.id.action_homeFragment_to_detailsFragment, bundle)
7、处理导航事件:
可以监听导航事件,例如 onNavigateUp 来处理返回按钮的事件。
kotlin
override fun onSupportNavigateUp(): Boolean {
return findNavController(R.id.nav_host_fragment).navigateUp()
|| super.onSupportNavigateUp()
}
8、自定义动画:
可以为导航操作设置自定义动画。
java
<action
android:id="@+id/action_homeFragment_to_detailsFragment"
app:destination="@id/detailsFragment"
app:enterAnim="@anim/slide_in_right"
app:exitAnim="@anim/slide_out_left"
app:popEnterAnim="@anim/slide_in_left"
app:popExitAnim="@anim/slide_out_right" />