Kotlin DSL を使用してナビゲーション グラフでアクションを定義すると、Navigation によって対応する NavAction
クラスが生成されます。このクラスには、そのアクション用に定義された次のような構成が含まれます。
- デスティネーション: ターゲット デスティネーションのリソース ID。
- デフォルト引数: 指定されている場合にターゲット デスティネーションのデフォルト値を格納する
android.os.Bundle
。 - ナビゲーション オプション:
NavOptions
として表現されるナビゲーション オプション。このクラスには、アニメーション リソース構成や、ポップ動作、デスティネーションをシングルトップ モードで起動するかどうかの設定など、ターゲット デスティネーションとの間の遷移に関する特別な構成がすべて格納されます。
Compose のオプション
デフォルトでは、navigate()
は新しいデスティネーションをバックスタックに追加します。navigate()
の動作を変更するには、追加のナビゲーション オプションを navigate()
呼び出しに渡します。
単純なラムダを使用して、NavOptions
のインスタンスを作成できます。NavOptions.Builder
に明示的に渡す可能性のある引数を代わりに navigate()
に渡します。以下の例を考えてみましょう。
例については、状況に応じて navigate()
にオプションを渡す方法のバックスタック ガイドをご覧ください。
XML のオプション
2 つの画面で構成され、一方の画面から他方の画面へ移動するアクションを持つグラフの例を次に示します。
<?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
インスタンスを受け取ります。