デスティネーションに移動する

Navigation コンポーネントは、デスティネーションに簡単に移動するための汎用的な方法を提供します。このインターフェースは、さまざまなコンテキストと UI フレームワークをサポートしています。たとえば、Compose、ビュー、フラグメント、アクティビティ、さらにはカスタム UI フレームワークでも Navigation コンポーネントを使用できます。

このガイドでは、さまざまなコンテキストで Navigation コンポーネントを使用してデスティネーションに移動する方法を説明します。

NavController を使用する

デスティネーション間の移動に使用するキーのタイプは NavController です。クラス自体の詳細とインスタンスの作成方法については、ナビゲーション コントローラを作成するをご覧ください。このガイドでは使用方法について説明します。

使用する UI フレームワークに関係なく、デスティネーションへの移動に使用できる単一の関数 NavController.navigate() があります。

navigate() には多くのオーバーロードが使用できます。正確なコンテキストに対応しているオーバーロードを選択する必要があります。たとえば、コンポーザブルに移動するときとビューに移動するときでは、それぞれ別のオーバーロードを使用する必要があります。

以下のセクションでは、使用できる主な navigate() オーバーロードをいくつか概説します。

コンポーザブルに移動する

コンポーザブルに移動するには、NavController.navigate<T> を使用する必要があります。このオーバーロードでは、navigate() は型を渡す単一の route 引数を取ります。デスティネーションへの鍵として機能します。

@Serializable
object FriendsList

navController.navigate(route = FriendsList)

ナビゲーション グラフ内のコンポーザブルに移動するには、まず、各デスティネーションがタイプに対応するように NavGraph を定義します。コンポーザブルの場合は、composable() 関数を使用して行います。

コンポーザブルからのイベントを公開する

コンポーズ可能な関数が新しい画面に移動する必要がある場合、navigate() を直接呼び出せるように、NavController への参照を渡さないでください。単方向データフロー(UDF)の原則に従って、NavController が処理するイベントを代わりにコンポーザブルが公開する必要があります。

より直接的に言うと、コンポーザブルには () -> Unit 型のパラメータが必要です。composable() 関数を使用して NavHost にデスティネーションを追加する場合は、コンポーザブルに NavController.navigate() への呼び出しを渡します。

次のサブセクションで例をご覧ください。

前のセクションのデモとして、次のスニペットでこれらのポイントを確認してください。

  1. グラフ内の各デスティネーションはルートを使用して作成されます。ルートは、そのデスティネーションが必要とするデータを記述するシリアル化可能なオブジェクトまたはクラスです。
  2. MyAppNavHost コンポーザブルは、NavController インスタンスを保持します。
  3. したがって、navigate() への呼び出しは ProfileScreen のような下位のコンポーザブルではなく、その状態で発生する必要があります。
  4. ProfileScreen には、クリックされたときにユーザーを FriendsList に移動させるボタンが含まれています。ただし、navigate() 自体が呼び出されることはありません。
  5. 代わりに、そのボタンで、パラメータ onNavigateToFriends として公開される関数を呼び出します。
  6. MyAppNavHostProfileScreen をナビゲーション グラフに追加すると、onNavigateToFriends には navigate(route = FriendsList を呼び出すラムダが渡されます。
  7. そうすることで、ユーザーが ProfileScreen ボタンを押すと、正確に FriendsListScreen へと移動します。
@Serializable
object Profile
@Serializable
object FriendsList

@Composable
fun MyAppNavHost(
    modifier: Modifier = Modifier,
    navController: NavHostController = rememberNavController(),

) {
    NavHost(
        modifier = modifier,
        navController = navController,
        startDestination = Profile
    ) {
        composable<Profile> {
            ProfileScreen(
                onNavigateToFriends = { navController.navigate(route = FriendsList) },
                /*...*/
            )
        }
        composable<FriendsList> { FriendsListScreen(/*...*/) }
    }
}

@Composable
fun ProfileScreen(
    onNavigateToFriends: () -> Unit,
    /*...*/
) {
    /*...*/
    Button(onClick = onNavigateToFriends) {
        Text(text = "See friends list")
    }
}

整数 ID を使用して移動する

整数 ID を使用してデスティネーションに移動するには、navigate(int) オーバーロードを呼び出して、アクションまたはデスティネーションのリソース ID を受け取ります。次のコード スニペットは、このオーバーロードを使用して ViewTransactionsFragment に移動する方法を示しています。

Kotlin

viewTransactionsButton.setOnClickListener { view ->
  view.findNavController().navigate(R.id.viewTransactionsAction)
}

Java

viewTransactionsButton.setOnClickListener(new View.OnClickListener() {
  @Override
  public void onClick(View view) {
      Navigation.findNavController(view).navigate(R.id.viewTransactionsAction);
  }
});

ID を使って移動する場合は、可能な限りアクションを使用する必要があります。アクションにより、ナビゲーション グラフに追加情報が提供され、デスティネーションが相互に接続する方法が視覚的に示されます。

NavDeepLinkRequest を使用して移動する

暗黙的ディープリンクのデスティネーションに移動するには、navigate(NavDeepLinkRequest) オーバーロードを使用します。次のスニペットは、次のメソッドの実装を示しています。

Kotlin

val request = NavDeepLinkRequest.Builder
  .fromUri("android-app://androidx.navigation.app/profile".toUri())
  .build()
findNavController().navigate(request)

Java

NavDeepLinkRequest request = NavDeepLinkRequest.Builder
  .fromUri(Uri.parse("android-app://androidx.navigation.app/profile"))
  .build()
NavHostFragment.findNavController(this).navigate(request)

アクション ID やデスティネーション ID を使用したナビゲーションとは異なり、デスティネーションが表示されているかどうかにかかわりなく、グラフ内の任意のディープリンクに移動できます。移動先は、現在のグラフ上にあるデスティネーションでも、まったく別のグラフ上にあるデスティネーションでも構いません。

アクションと MIME タイプ

Uri に加えて、NavDeepLinkRequest でもアクションと MIME タイプのディープリンクがサポートされています。リクエストにアクションを追加するには、fromAction() または setAction() を使用します。MIME タイプをリクエストに追加するには、fromMimeType() または setMimeType() を使用します。

NavDeepLinkRequest が暗黙的ディープリンクのデスティネーションと適切に一致するためには、URI、アクション、MIME タイプのすべてがデスティネーションの NavDeepLink と一致している必要があります。URI のパターンは一致しており、アクションは完全に一致している必要があります。また、MIME タイプは関連していなければなりません。たとえば、image/jpgimage/\* と一致します。

その他のコンテキスト

このドキュメントでは、最も一般的なユースケースで NavController.navigate() を使用する方法について説明します。ただし、この関数には幅広いオーバーロードがあり、さまざまなコンテキストで、UI フレームワークと並行して使用できます。これらのオーバーロードの詳細については、リファレンス ドキュメントをご覧ください。

参考資料

詳しくは、以下のページをご覧ください。