Nella navigazione di Android, il termine destinazione della finestra di dialogo si riferisce alle destinazioni all'interno del grafico di navigazione dell'app che assumono la forma di finestre di dialogo e 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 sul modo in cui le destinazioni delle finestre di dialogo interagiscono con lo stack posteriore di NavController
.
Finestra di dialogo componibile
Per creare una destinazione per la finestra di dialogo in Compose, aggiungi una destinazione a NavHost
utilizzando la funzione dialog()
. La funzione si comporta sostanzialmente come composable
, ma crea una destinazione della finestra di dialogo anziché una destinazione ospitata.
Considera l'esempio seguente:
@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() }
}
}
- La destinazione di partenza utilizza la route
Home
. Poichécomposable()
lo aggiunge al grafico, è una destinazione ospitata. - L'altra destinazione utilizza la route
Settings
.- Allo stesso modo, poiché
dialog()
la aggiunge al grafico, è la destinazione di una finestra di dialogo. - Quando l'utente passa da
HomeScreen
aSettingsScreen
, il secondo viene visualizzato sopraHomeScreen
.
- Allo stesso modo, poiché
- Anche se
SettingsScreen
non include un elemento componibileDialog
in sé, poiché è una destinazione di finestra di dialogo,NavHost
lo visualizza all'interno diDialog
.
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 necessita di un proprio ciclo di vita e di stato salvato, indipendentemente da qualsiasi altra destinazione nel grafico di navigazione. Ti consigliamo di utilizzare un elemento AlertDialog
o un componibile correlato se vuoi una finestra di dialogo per un prompt meno complesso, come una conferma.
DSL Kotlin
Se stai lavorando con i frammenti e stai utilizzando Kotlin DSL per creare il grafico, l'aggiunta di una destinazione della finestra di dialogo è molto simile all'utilizzo di Scrivi.
Considera come nel seguente snippet viene utilizzata anche la funzione dialog()
per aggiungere una destinazione di finestra di dialogo che utilizza un frammento:
// 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
Se esiste già un elemento DialogFragment
, utilizza l'elemento <dialog>
per aggiungere la finestra di dialogo al grafico di navigazione, come mostrato 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>