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() }
}
}
- Na początkowym etapie podróży używana jest trasa
Home
. Ponieważ elementcomposable()
dodaje go do wykresu, jest to hostowane miejsce docelowe. - 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
doSettingsScreen
, ta ostatnia pozycja wyświetla się w okresieHomeScreen
.
- Podobnie, ponieważ
- Chociaż
SettingsScreen
nie zawiera samego elementu kompozycyjnegoDialog
, ponieważ jest to miejsce docelowe okna,NavHost
wyświetla go w elemencieDialog
.
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>