使用选项导航

当您使用 Kotlin DSL 在导航图中定义操作时,Navigation 会生成相应的 NavAction 类,其中包含为该操作定义的配置,包括以下内容

  • 目标: 目标目标的资源 ID。
  • 默认参数: 一个 android.os.Bundle,其中包含目标目标的默认值(如果提供)。
  • 导航选项: 导航选项,表示为 NavOptions。此类包含所有用于转换到目标目标和从目标目标转换回的特殊配置,包括动画资源配置、弹出行为以及目标目标是否应在单一顶部模式下启动。

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() 的扩展形式,并包含额外的 BundleNavOptions 参数。所有 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 实例。