Miejsca docelowe okien

W przypadku nawigacji na Androidzie termin miejsce docelowe okna odnosi się do miejsc docelowych na wykresie nawigacyjnym aplikacji, które mają postać okien dialogowych, które nakładają się na elementy interfejsu aplikacji i zawartość.

Miejsca docelowe okien wyświetlają się nad hostowanymi miejscami docelowymi, które wypełniają hosta nawigacji, dlatego musisz wziąć pod uwagę kilka ważnych kwestii związanych z interakcjami miejsc docelowych okien ze stokiem wstecznym NavController.

Okno kompozycyjne

Aby utworzyć miejsce docelowe okna w oknie tworzenia, dodaj miejsce docelowe do elementu NavHost za pomocą funkcji dialog(). Ta funkcja działa zasadniczo tak samo jak composable(), ale tworzy miejsce docelowe okna dialogowego, a nie hostowane miejsce docelowe.

Przeanalizuj ten przykład:

@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. Miejsce docelowe początkowe to funkcja kompozycyjna Home. Jest hostowany, ponieważ wykorzystuje composable().
  2. Drugie miejsce docelowe to funkcja kompozycyjna SettingsDialog. Funkcja dialog() dodaje ją do wykresu, więc jest miejscem docelowym okna. Gdy użytkownik przejdzie z poziomu Home do SettingsDialog, ta druga opcja pojawi się nad wartością Home.
  3. Chociaż SettingsDialog nie zawiera samego elementu kompozycyjnego Dialog, ponieważ jest to miejsce docelowe okna, NavHost wyświetla go w elemencie Dialog.

Miejsca docelowe okna wyświetlają się nad poprzednim miejscem docelowym w: NavHost. Używaj ich, gdy okno przedstawia osobny ekran aplikacji, który wymaga własnego cyklu życia i zapisanego stanu, niezależnie od innych miejsc docelowych na wykresie nawigacyjnym. Jeśli potrzebujesz okna z mniej złożonym promptem, na przykład potwierdzenia, możesz użyć elementu AlertDialog lub powiązanego elementu kompozycyjnego.

Kotlin DSL

Jeśli do pracy z fragmentami używasz obrazu z użyciem Kotlin DSL, dodawanie miejsca docelowego okna dialogowego jest bardzo podobne do dodawania opcji tworzenia wiadomości.

Zobacz, jak w tym fragmencie kodu również używamy funkcji dialog() do dodania miejsca docelowego okna, które korzysta z fragmentu:

// 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"
    }
}

Plik XML

Jeśli masz już element DialogFragment, użyj elementu <dialog>, aby dodać okno dialogowe do wykresu nawigacyjnego, jak w tym przykładzie:

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