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 einige wichtige Aspekte hinsichtlich der Interaktion von Dialogfeldzielen mit dem Back-Stack von NavController berücksichtigt werden.

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:

@Serializable
object Home
@Serializable
object Settings
@Composable
fun HomeScreen(onNavigateToSettings: () -> Unit){
    Column {
        Text("Home")
        Button(onClick = onNavigateToSettings){
            Text("Open settings")
        }
    }
}

// This screen will be displayed as a dialog
@Composable
fun SettingsScreen(){
    Text("Settings")
    // ...
}

@Composable
fun MyApp() {
    val navController = rememberNavController()
    NavHost(navController, startDestination = Home) {
        composable<Home> { HomeScreen(onNavigateToSettings = { navController.navigate(route = Settings) }) }
        dialog<Settings> { SettingsScreen() }
    }
}
  1. Als Startziel wird die Route Home verwendet. Da composable() sie dem Diagramm hinzufügt, ist es ein gehostetes Ziel.
  2. Das andere Ziel verwendet die Route Settings.
    • Da dialog() sie dem Diagramm hinzufügt, ist sie auch ein Dialogfeldziel.
    • Wenn der Nutzer von HomeScreen nach SettingsScreen wechselt, wird Letzteres über HomeScreen angezeigt.
  3. Obwohl SettingsScreen 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 sie, 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:

// Define destinations with serializable classes or objects
@Serializable
object Home
@Serializable
object Settings

// Add the graph to the NavController with `createGraph()`.
navController.graph = navController.createGraph(
    startDestination = Home
) {
    // Associate the home route with the HomeFragment.
    fragment<HomeFragment, Home> {
        label = "Home"
    }

    // Define the settings destination as a dialog using DialogFragment.
    dialog<SettingsFragment, Settings> {
        label = "Settings"
    }
}

XML

Wenn Sie bereits ein DialogFragment haben, verwenden Sie das Element <dialog>, um das Dialogfeld wie im folgenden Beispiel in Ihre Navigationsgrafik einzufü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>