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:

@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() }
    }
}
  1. Na początkowym etapie podróży używana jest trasa Home. Ponieważ element composable() dodaje go do wykresu, jest to hostowane miejsce docelowe.
  2. Drugi cel podróży korzysta z trasy Settings.
    • Podobnie, ponieważ dialog() dodaje go do wykresu, jest miejscem docelowym okna.
    • Gdy użytkownik przechodzi z HomeScreen do SettingsScreen, ta ostatnia pozycja wyświetla się w okresie HomeScreen.
  3. Chociaż SettingsScreen 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 w aplikacji oddzielny ekran, 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:

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

Jeśli masz już DialogFragment, użyj elementu <dialog>, aby dodać okno dialogowe do wykresu nawigacyjnego, jak pokazano 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>