当您使用 Kotlin DSL 在导航图中定义操作时,Navigation 会生成相应的 NavAction
类,其中包含为该操作定义的配置,包括以下内容
- 目的地: 目标目的地的资源 ID。
- 默认参数: 一个
android.os.Bundle
,如果已提供,则包含目标目的地的默认值。 - 导航选项: 导航选项,表示为
NavOptions
。此类包含所有用于过渡到目标目的地和从目标目的地返回的特殊配置,包括动画资源配置、弹出行为以及目的地是否应以 single top 模式启动。
Compose 选项
默认情况下,navigate()
会将您的新目的地添加到返回堆栈。您可以通过向 navigate()
调用传递额外的导航选项来修改 navigate()
的行为。
您可以使用简单的 lambda 创建 NavOptions
实例。将您本会明确传递给 NavOptions.Builder
的参数传递给 navigate()
。请考虑以下示例
有关示例,请参阅返回堆栈指南,了解如何在上下文中将选项传递给 navigate()
。
XML 选项
以下是一个示例图,由两个屏幕组成,以及一个从一个屏幕导航到另一个屏幕的操作
<?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/a">
<fragment android:id="@+id/a"
android:name="com.example.myapplication.FragmentA"
android:label="a"
tools:layout="@layout/a">
<action android:id="@+id/action_a_to_b"
app:destination="@id/b"
app:enterAnim="@anim/nav_default_enter_anim"
app:exitAnim="@anim/nav_default_exit_anim"
app:popEnterAnim="@anim/nav_default_pop_enter_anim"
app:popExitAnim="@anim/nav_default_pop_exit_anim"/>
</fragment>
<fragment android:id="@+id/b"
android:name="com.example.myapplication.FragmentB"
android:label="b"
tools:layout="@layout/b">
<action android:id="@+id/action_b_to_a"
app:destination="@id/a"
app:enterAnim="@anim/nav_default_enter_anim"
app:exitAnim="@anim/nav_default_exit_anim"
app:popEnterAnim="@anim/nav_default_pop_enter_anim"
app:popExitAnim="@anim/nav_default_pop_exit_anim"
app:popUpTo="@+id/a"
app:popUpToInclusive="true"/>
</fragment>
</navigation>
当导航图被加载时,这些操作将被解析,并生成与图中定义的配置相对应的 NavAction
对象。例如,action_b_to_a
定义为从目的地 b
导航到目的地 a
。此操作包括动画以及 popTo
行为,该行为会从返回堆栈中移除所有目的地。所有这些设置都被捕获为 NavOptions
并附加到 NavAction
。
要遵循此 NavAction
,请使用 NavController.navigate()
并传递操作的 ID,如以下示例所示
navController.navigate(R.id.action_b_to_a)
以编程方式应用选项
前面的示例展示了如何在导航图 XML 中指定 NavOptions
。但是,特定选项可能因构建时未知约束而异。在这种情况下,必须以编程方式创建和设置 NavOptions
,如以下示例所示
Kotlin
findNavController().navigate(
R.id.action_fragmentOne_to_fragmentTwo,
null,
navOptions { // Use the Kotlin DSL for building NavOptions
anim {
enter = android.R.animator.fade_in
exit = android.R.animator.fade_out
}
}
)
Java
NavController navController = NavHostFragment.findNavController(this);
navController.navigate(
R.id.action_fragmentOne_to_fragmentTwo,
null,
new NavOptions.Builder()
.setEnterAnim(android.R.animator.fade_in)
.setExitAnim(android.R.animator.fade_out)
.build()
);
此示例使用了 navigate()
的扩展形式,并包含额外的 Bundle
和 NavOptions
参数。navigate()
的所有变体都有接受 NavOptions
参数的扩展版本。
您还可以在导航到隐式深层链接时以编程方式应用 NavOptions
Kotlin
findNavController().navigate(
deepLinkUri,
navOptions { // Use the Kotlin DSL for building NavOptions
anim {
enter = android.R.animator.fade_in
exit = android.R.animator.fade_out
}
}
)
Java
NavController navController = NavHostFragment.findNavController(this);
navController.navigate(
deepLinkUri,
new NavOptions.Builder()
.setEnterAnim(android.R.animator.fade_in)
.setExitAnim(android.R.animator.fade_out)
.build()
);
此 navigate()
的变体接受隐式深层链接的 Uri
以及 NavOptions
实例。