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