ダイアログのデスティネーション

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") }) }
    }
}
  1. 開始デスティネーションは Home コンポーザブルです。composable() を使用するため、ホストされたデスティネーションになります。
  2. もう 1 つのデスティネーションは SettingsDialog コンポーザブルです。これは dialog() 関数がグラフに追加するため、ダイアログのデスティネーションになります。ユーザーが Home から SettingsDialog に移動すると、後者は Home に表示されます。
  3. SettingsDialog には Dialog コンポーザブル自体は含まれていませんが、ダイアログ デスティネーションであるため、NavHostDialog 内に表示します。

ダイアログのデスティネーションは、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>