Destinazioni delle finestre di dialogo

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") }) }
    }
}
  1. La destinazione iniziale è la componibile Home. Poiché utilizza composable(), è una destinazione ospitata.
  2. L'altra destinazione è la componibile SettingsDialog. Poiché la funzione dialog() la aggiunge al grafico, è una destinazione della finestra di dialogo. Quando l'utente passa da Home a SettingsDialog, il secondo viene visualizzato sopra Home.
  3. Anche se SettingsDialog non include un elemento componibile Dialog, perché è una destinazione di una finestra di dialogo, NavHost lo visualizza all'interno di un Dialog.

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>