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

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

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

NavController を使用する

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

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

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

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

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

ナビゲーション グラフ内のコンポーザブルに移動するには、NavController.navigate(route) を使用します。このオーバーロードでは、navigate()String 引数を 1 つ取ります。これは route で、デスティネーションへの鍵として機能します。

navController.navigate("friendslist")

route 文字列を使用して移動するには、まず NavGraph を作成して、各デスティネーションを route に関連付ける必要があります。コンポーザブルに対しては、composable() 関数で行います。

詳細については、デスティネーションに移動するをご覧ください。

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

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

次のサブセクションで、わかりやすい例をご覧ください。

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

  1. MyAppNavHost コンポーザブルは、NavController インスタンスを保持します。
  2. したがって、navigate() への呼び出しは ProfileScreen のような下位のコンポーザブルではなく、その状態で発生する必要があります。
  3. ProfileScreen には、クリックされたときにユーザーを FriendsList に移動させるボタンが含まれています。ただし、navigate() 自体が呼び出されることはありません。
  4. 代わりに、そのボタンで、パラメータ onNavigateToFriends として公開される関数を呼び出します。
  5. MyAppNavHostProfileScreen をナビゲーション グラフに追加すると、onNavigateToFriends には navigate() を呼び出すラムダが渡されます。
  6. そうすることで、ユーザーが ProfileScreen ボタンを押すと、正確に friendsList へと移動します。
@Composable
fun MyAppNavHost(
    modifier: Modifier = Modifier,
    navController: NavHostController = rememberNavController(),
    startDestination: String = "profile"
) {
    NavHost(
        modifier = modifier,
        navController = navController,
        startDestination = startDestination
    ) {
        composable("profile") {
            ProfileScreen(
                onNavigateToFriends = { navController.navigate("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 フレームワークと並行して使用できます。これらのオーバーロードの詳細については、リファレンス ドキュメントをご覧ください。

参考資料

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