Адреса диалога,Место назначения диалога

В навигации 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() }
    }
}
  1. Начальный пункт назначения использует Home маршрут. Поскольку composable() добавляет его в граф, это размещенный пункт назначения.
  2. Другой пункт назначения использует маршрут Settings .
    • Аналогичным образом, поскольку dialog() добавляет его в граф, это пункт назначения диалога.
    • Когда пользователь переходит от HomeScreen к SettingsScreen последний появляется поверх HomeScreen .
  3. Хотя 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>