使用選項導覽

使用 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 例項也是如此。