Miejsca docelowe okien

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

Ponieważ miejsca docelowe w oknach są wyświetlane w hostowanych miejscach docelowych, które wypełniają pole na hoście nawigacji, należy pamiętać o kilku ważnych kwestiach dotyczących miejsca docelowe wchodzą w interakcję ze stosem wstecznym Twojego NavController.

Okno z możliwością tworzenia

Aby utworzyć miejsce docelowe w oknie Compose, dodaj miejsce docelowe w NavHost za pomocą funkcji dialog(). Funkcja działa zasadniczo tak samo jak composable, tylko tworzy miejsce docelowe okna, a nie hostowane miejsce docelowe.

Przyjrzyjmy się temu przykładowi:

@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. Początkowe miejsce docelowe wykorzystuje trasę Home. Ponieważ composable() dodaje go do wykresu. Jest to hostowane miejsce docelowe.
  2. Drugie miejsce docelowe używa trasy Settings.
    • Analogicznie dialog() dodaje go do wykresu, więc jest to okno dialogowe miejsce docelowe.
    • Gdy użytkownik przejdzie z HomeScreen do SettingsScreen, druga pojawia się nad HomeScreen.
  3. Chociaż SettingsScreen nie zawiera samej funkcji kompozycyjnej Dialog, ponieważ jest to miejsce docelowe okna, NavHost wyświetla je w Dialog

Miejsca docelowe w oknach są wyświetlane nad poprzednim miejscem docelowym w komponencie NavHost. Używaj gdy okno dialogowe to oddzielny ekran aplikacji, który musi mieć własny cyklu życia i zapisanym stanie, niezależnie od innych wykres nawigacyjny. Możesz użyć AlertDialog lub powiązanych kompozycyjne, jeśli potrzebujesz okna z mniej złożonym promptem, takim jak z potwierdzeniem.

Kotlin DSL

Jeśli pracujesz z fragmentami i korzystasz z kanału DSL Kotlin, utworzenie wykresu. Dodawanie miejsca docelowego okna dialogowego jest bardzo podobne do Utwórz.

Zastanów się, jak ten fragment kodu wykorzystuje też funkcję dialog() do dodaj miejsce docelowe w oknie, 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ż obiekt DialogFragment, użyj elementu <dialog>, aby dodaj okno do wykresu nawigacyjnego, jak w poniższym 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>