オプションで移動する

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() のバリアントは、暗黙的ディープリンク用の UriNavOptions インスタンスを受け取ります。