В навигации Android термин «пункт назначения диалога» относится к местам назначения в графе навигации приложения, которые принимают форму диалоговых окон, накладываясь на элементы пользовательского интерфейса приложения и контент.
Поскольку пункты назначения диалога появляются поверх размещенных пунктов назначения , которые заполняют хост навигации, существует несколько важных соображений относительно того, как пункты назначения диалога взаимодействуют с задним стеком вашего NavController
.
Диалог компонуемый
Чтобы создать пункт назначения диалога в Compose, добавьте пункт назначения в свой NavHost
с помощью функции dialog()
. Функция ведет себя по существу так же, как composable
, только она создает место назначения для диалога, а не размещение на хосте .
Рассмотрим следующий пример:
@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() }
}
}
- Начальный пункт назначения использует
Home
маршрут. Посколькуcomposable()
добавляет его в граф, это размещенный пункт назначения. - Другой пункт назначения использует маршрут
Settings
.- Аналогичным образом, поскольку
dialog()
добавляет его в граф, это пункт назначения диалога. - Когда пользователь переходит от
HomeScreen
кSettingsScreen
последний появляется поверхHomeScreen
.
- Аналогичным образом, поскольку
- Хотя
SettingsScreen
не включает в себя составной элементDialog
, поскольку он является местом назначения диалога,NavHost
отображает его внутриDialog
.
Пункты назначения диалога отображаются поверх предыдущего пункта назначения в NavHost
. Используйте их, когда диалоговое окно представляет собой отдельный экран вашего приложения, которому требуется собственный жизненный цикл и сохраненное состояние, независимое от любого другого места назначения в вашем графе навигации. Возможно, вы предпочтете использовать AlertDialog
или связанный с ним составной объект, если вам нужен диалог для менее сложного запроса, например подтверждения.
Котлин DSL
Если вы работаете с фрагментами и используете Kotlin DSL для создания графа, добавление пункта назначения диалога очень похоже на использование Compose.
Рассмотрим, как в следующем фрагменте также используется функция dialog()
для добавления пункта назначения диалога, использующего фрагмент:
// 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
Если у вас есть DialogFragment
, используйте элемент <dialog>
, чтобы добавить диалог в граф навигации, как показано в следующем примере:
<?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>