使用 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() 的擴充格式,並包含額外的 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 例項也是如此。