Nella navigazione Android, il termine destinazione finestra di dialogo si riferisce alle destinazioni all'interno del grafico di navigazione dell'app che assumono la forma di finestre di dialogo che si sovrappongono a contenuti e elementi dell'interfaccia utente dell'app.
Poiché le destinazioni delle finestre di dialogo vengono visualizzate sopra le destinazioni ospitate che riempiono l'host di navigazione, è necessario considerare alcune importanti considerazioni su come le destinazioni delle finestre di dialogo interagiscono con lo stack posteriore di NavController
.
Finestra di dialogo componibile
Per creare una destinazione per una finestra di dialogo in Scrivi, aggiungi una destinazione a NavHost
utilizzando la funzione dialog()
. La funzione si comporta sostanzialmente come composable()
, ma crea una destinazione della finestra di dialogo invece che una destinazione ospitata.
Considera il seguente esempio:
@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") }) }
}
}
- La destinazione iniziale è la componibile
Home
. Poiché utilizzacomposable()
, è una destinazione ospitata. - L'altra destinazione è la componibile
SettingsDialog
. Poiché la funzionedialog()
la aggiunge al grafico, è una destinazione della finestra di dialogo. Quando l'utente passa daHome
aSettingsDialog
, il secondo viene visualizzato sopraHome
. - Anche se
SettingsDialog
non include un elemento componibileDialog
, perché è una destinazione di una finestra di dialogo,NavHost
lo visualizza all'interno di unDialog
.
Le destinazioni delle finestre di dialogo vengono visualizzate sopra la destinazione precedente in NavHost
.
Utilizzale quando la finestra di dialogo rappresenta una schermata separata nell'app che ha bisogno di un proprio ciclo di vita e di stato salvato, indipendentemente da qualsiasi altra destinazione nel grafico di navigazione. Potresti preferire l'utilizzo di AlertDialog
o di un tipo componibile correlato se vuoi una finestra di dialogo per un prompt meno complesso, ad esempio una conferma.
DSL Kotlin
Se lavori con i frammenti e utilizzi l'interfaccia DSL di Kotlin per creare il grafico, l'aggiunta di una destinazione della finestra di dialogo è molto simile a quando si utilizza Scrivi.
Considera come nel seguente snippet viene utilizzata anche la funzione dialog()
per aggiungere una destinazione di finestra di dialogo che utilizza un frammento:
// 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
Se esiste già un elemento DialogFragment
, utilizza l'elemento <dialog>
per aggiungere la finestra di dialogo al grafico di navigazione, come illustrato nell'esempio seguente:
<?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>