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

В навигации 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>
,

В навигации 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>