Android ナビゲーションにおいて、ダイアログ デスティネーションという用語は、アプリの UI 要素とコンテンツをオーバーレイするダイアログ ウィンドウという形式のアプリのナビゲーション グラフ内のデスティネーションを指します。
ダイアログ デスティネーションは、ナビゲーション ホストを満たすホストされたデスティネーションの上に表示されるため、ダイアログ デスティネーションが NavController
のバックスタックとやり取りする方法に関して重要な考慮事項がいくつかあります。
ダイアログ コンポーザブル
Compose でダイアログ デスティネーションを作成するには、dialog()
関数を使用して NavHost
にデスティネーションを追加します。この関数は基本的に composable()
と同じように動作しますが、ホストされるデスティネーションではなくダイアログ デスティネーションを作成する点が異なります。
次の例を考えてみましょう。
@Composable
fun SettingsDialog(){
Text("Settings")
// ...
}
@Composable
fun MyApp() {
val navController = rememberNavController()
NavHost(navController, startDestination = "home") {
composable("home") { Home(onNavigateToHome = { navController.navigate("home") }) }
dialog("settings") { SettingsDialog(onNavigateToSettingsDialog = { navController.navigate("settings") }) }
}
}
- 開始デスティネーションは
Home
コンポーザブルです。composable()
を使用するため、ホストされたデスティネーションになります。 - もう 1 つのデスティネーションは
SettingsDialog
コンポーザブルです。これはdialog()
関数がグラフに追加するため、ダイアログのデスティネーションになります。ユーザーがHome
からSettingsDialog
に移動すると、後者はHome
に表示されます。 SettingsDialog
にはDialog
コンポーザブル自体は含まれていませんが、ダイアログ デスティネーションであるため、NavHost
はDialog
内に表示します。
ダイアログのデスティネーションは、NavHost
内で前のデスティネーションの上に重ねて表示されます。ナビゲーション グラフ内の他のデスティネーションとは関係なく、独自のライフサイクルと保存済み状態を必要とするアプリ内の個別の画面をダイアログが表す場合に使用します。確認などのあまり複雑でないプロンプトのダイアログが必要な場合は、AlertDialog
または関連するコンポーザブルを使用することをおすすめします。
Kotlin DSL
フラグメントを使用し、Kotlin DSL を使用してグラフを作成している場合、ダイアログ デスティネーションを追加する方法は、Compose を使用する場合とよく似ています。
次のスニペットでも dialog()
関数を使用して、フラグメントを使用するダイアログのデスティネーションを追加しています。
// Add the graph to the NavController with `createGraph()`.
navController.graph = navController.createGraph(
startDestination = "home"
) {
// Associate the "home" destination with the HomeFragment.
fragment<HomeFragment>("home") {
label = "Home"
}
// Define the "settings" destination as a dialog using DialogFragment.
dialog<SettingsDialogFragment>("settings") {
label = "Settings Dialog"
}
}
XML
既存の DialogFragment
がある場合は、次の例に示すように、<dialog>
要素を使用してダイアログをナビゲーション グラフに追加します。
<?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" android:id="@+id/nav_graph"> ... <dialog android:id="@+id/my_dialog_fragment" android:name="androidx.navigation.myapp.MyDialogFragment"> <argument android:name="myarg" android:defaultValue="@null" /> <action android:id="@+id/myaction" app:destination="@+id/another_destination"/> </dialog> ... </navigation>