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() }
}
}
- Als Startziel wird die Route
Home
verwendet. Dacomposable()
sie dem Diagramm hinzufügt, ist es ein gehostetes Ziel. - Das andere Ziel verwendet die Route
Settings
.- Da
dialog()
sie dem Diagramm hinzufügt, ist sie auch ein Dialogfeldziel. - Wenn der Nutzer von
HomeScreen
nachSettingsScreen
wechselt, wird Letzteres überHomeScreen
angezeigt.
- Da
- Obwohl
SettingsScreen
selbst keine zusammensetzbareDialog
-Funktion enthält, da es ein Dialogziel ist, wird sie vonNavHost
in einemDialog
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>