Dialogfeldziele

In der Android-Navigation bezieht sich der Begriff Dialogziel auf Ziele im Navigationsdiagramm der App, die in Form von Dialogfeldern auftreten, die App-UI-Elemente und -Inhalte überlagern.

Da Dialogfeldziele über gehosteten Zielen angezeigt werden, die den Navigationshost ausfüllen, müssen Sie einige wichtige Aspekte im Hinblick auf die Interaktion von Dialogzielen mit dem Back-Stack von NavController berücksichtigen.

Dialogfeld zusammensetzbare Funktionen

Wenn Sie in Compose ein Dialogfeldziel erstellen möchten, fügen Sie dem NavHost mithilfe der Funktion dialog() ein Ziel hinzu. Die Funktion verhält sich im Wesentlichen wie composable(), erstellt nur ein Dialogziel und kein gehostetes Ziel.

Hier ein Beispiel:

@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. Das Startziel ist die zusammensetzbare Funktion Home. Da es composable() verwendet, ist es ein gehostetes Ziel.
  2. Das andere Ziel ist die zusammensetzbare Funktion SettingsDialog. Da die Funktion dialog() sie dem Diagramm hinzufügt, ist es ein Dialogfeldziel. Wenn der Nutzer von Home nach SettingsDialog wechselt, wird Letzteres über Home angezeigt.
  3. Obwohl SettingsDialog selbst keine zusammensetzbare Dialog-Funktion enthält, da es ein Dialogziel ist, wird sie von NavHost in einem Dialog angezeigt.

Dialogfeldziele werden über dem vorherigen Ziel in NavHost angezeigt. Verwenden Sie diese, wenn das Dialogfeld einen separaten Bildschirm in Ihrer Anwendung darstellt, der einen eigenen Lebenszyklus und einen eigenen gespeicherten Status benötigt, und zwar unabhängig von einem anderen Ziel in der Navigationsgrafik. Sie können eine AlertDialog oder eine ähnliche zusammensetzbare Funktion verwenden, wenn Sie ein Dialogfeld für eine weniger komplexe Aufforderung benötigen, z. B. eine Bestätigung.

Kotlin-DSL

Wenn Sie mit Fragmenten arbeiten und zum Erstellen Ihrer Grafik Kotlin-DSL verwenden, gehen Sie beim Hinzufügen eines Dialogfeldziels sehr ähnlich vor wie bei der Verwendung von Composer.

Sehen Sie sich an, wie im folgenden Snippet auch die Funktion dialog() verwendet wird, um ein Dialogfeldziel hinzuzufügen, das ein Fragment verwendet:

// 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

Wenn Sie bereits ein DialogFragment-Element haben, verwenden Sie das Element <dialog>, um das Dialogfeld wie im folgenden Beispiel zu Ihrer Navigationsgrafik hinzuzufügen:

<?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>