Navigation コンポーネントは、デスティネーションに簡単に移動するための汎用的な方法を提供します。このインターフェースは、さまざまなコンテキストと UI フレームワークをサポートしています。たとえば、Compose、ビュー、フラグメント、アクティビティ、さらにはカスタム UI フレームワークでも Navigation コンポーネントを使用できます。
このガイドでは、さまざまなコンテキストで Navigation コンポーネントを使用してデスティネーションに移動する方法を説明します。
NavController を使用する
デスティネーション間の移動に使用するキーのタイプは NavController
です。クラス自体の詳細とインスタンスの作成方法については、ナビゲーション コントローラを作成するをご覧ください。このガイドでは使用方法について説明します。
Navigate
使用する 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()
への呼び出しを渡します。
この例については、次のサブセクションをご覧ください。
例
前のセクションのデモンストレーションとして、 次のスニペット:
- グラフ内の各デスティネーションは、ルート(ルート)を使用して作成されます。 必要なデータを記述するシリアル化可能なオブジェクトまたはクラス あります。
MyAppNavHost
コンポーザブルは、NavController
インスタンスを保持します。- したがって、
navigate()
への呼び出しはProfileScreen
のような下位のコンポーザブルではなく、その状態で発生する必要があります。 ProfileScreen
には、クリックされたときにユーザーをFriendsList
に移動させるボタンが含まれています。ただし、navigate()
自体が呼び出されることはありません。- 代わりに、そのボタンで、パラメータ
onNavigateToFriends
として公開される関数を呼び出します。 MyAppNavHost
がナビゲーション グラフにProfileScreen
を追加すると、次のようになります。onNavigateToFriends
はnavigate(route = FriendsList
を呼び出すラムダを渡します)。- そうすることで、ユーザーが
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/jpg
は image/\*
と一致します。
その他のコンテキスト
このドキュメントでは、最も一般的なユースケースで NavController.navigate()
を使用する方法について説明します。ただし、この関数には幅広いオーバーロードがあり、さまざまなコンテキストで、UI フレームワークと並行して使用できます。これらのオーバーロードの詳細については、リファレンス ドキュメントをご覧ください。
参考資料
詳しくは、以下のページをご覧ください。