Dialogfeldziele

In der Android-Navigation bezieht sich der Begriff Ziel des Dialogfelds auf Ziele. in der Navigationsgrafik der App in Form von Dialogfenstern, App-UI-Elemente und -Inhalte überlagern.

Da Dialogfeldziele über gehosteten Zielen angezeigt werden, die den Parameter müssen Sie einige wichtige Überlegungen dazu anstellen, wie Ziele mit dem Back-Stack Ihrer NavController interagieren.

Dialog zusammensetzbar

Wenn Sie in „Schreiben“ ein Dialogfeld erstellen möchten, fügen Sie der Datei NavHost ein Ziel hinzu mit der Funktion dialog(). Die Funktion verhält sich im Wesentlichen genauso wie composable wird nur ein Dialogziel erstellt und kein gehosteter Ziel.

Betrachten Sie das folgende 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. Weil composable() fügt es der Grafik hinzu, es handelt sich um ein gehostetes Ziel.
  2. Das andere Ziel verwendet die Route Settings.
    • Da sie von dialog() der Grafik hinzugefügt wird, handelt es sich ebenfalls um ein Dialogfeld. Ziel.
    • Wenn der Nutzer von HomeScreen nach SettingsScreen wechselt, Letztere erscheint über HomeScreen.
  3. SettingsScreen enthält zwar selbst keine zusammensetzbare Dialog-Funktion, da es sich um ein Dialogziel handelt, wird es vom NavHost innerhalb eines Dialog.

Dialogziele werden in NavHost über dem vorherigen Ziel angezeigt. Verwenden Sie wenn das Dialogfeld einen separaten Bildschirm in Ihrer App darstellt, für den ein eigenes Lebenszyklus und gespeicherter Status unabhängig von anderen Zielen in Ihrem Navigationsdiagramm. Sie könnten auch ein AlertDialog oder ähnliches zusammensetzbar, wenn Sie ein Dialogfeld für einen weniger komplexen Prompt wie eine bestätigen.

Kotlin-DSL

Wenn Sie mit Fragmenten arbeiten und Kotlin DSL verwenden, um das Hinzufügen eines Dialogziels ähnelt der Schreiben.

Im folgenden Snippet wird außerdem die Funktion dialog() verwendet, um Fügen Sie ein Dialogfeldziel hinzu, 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-Element haben, verwenden Sie das Element <dialog>, um Fügen Sie das Dialogfeld Ihrer Navigationsgrafik hinzu, wie im folgenden Beispiel gezeigt:

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