Когда вы определяете действие в графе навигации с помощью Kotlin DSL, Navigation генерирует соответствующий класс NavAction
, который содержит конфигурации, определенные для этого действия, включая следующие:
- Назначение : идентификатор ресурса целевого пункта назначения.
- Аргументы по умолчанию : файл
android.os.Bundle
, содержащий значения по умолчанию для целевого пункта назначения, если они указаны. - Параметры навигации : Параметры навигации, представленные как
NavOptions
. Этот класс содержит всю специальную конфигурацию для перехода к целевому месту назначения и обратно, включая конфигурацию ресурса анимации, поведение всплывающего окна и необходимость запуска места назначения в режиме одиночной вершины.
Опции с помощью Compose
По умолчанию navigate()
добавляет новый пункт назначения в задний стек. Вы можете изменить поведение navigate()
, передав дополнительные параметры навигации в вызов navigate()
.
Вы можете создать экземпляр NavOptions
используя простую лямбду. Передайте navigate()
аргументы, которые в противном случае вы могли бы явно передать в NavOptions.Builder
. Рассмотрим следующие примеры:
Примеры см. в руководстве по обратному стеку, где приведены примеры передачи параметров в navigate()
в контексте.
Варианты с XML
Ниже приведен пример графика, состоящего из двух экранов и действия для перехода от одного к другому:
<?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"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/nav_graph"
app:startDestination="@id/a">
<fragment android:id="@+id/a"
android:name="com.example.myapplication.FragmentA"
android:label="a"
tools:layout="@layout/a">
<action android:id="@+id/action_a_to_b"
app:destination="@id/b"
app:enterAnim="@anim/nav_default_enter_anim"
app:exitAnim="@anim/nav_default_exit_anim"
app:popEnterAnim="@anim/nav_default_pop_enter_anim"
app:popExitAnim="@anim/nav_default_pop_exit_anim"/>
</fragment>
<fragment android:id="@+id/b"
android:name="com.example.myapplication.FragmentB"
android:label="b"
tools:layout="@layout/b">
<action android:id="@+id/action_b_to_a"
app:destination="@id/a"
app:enterAnim="@anim/nav_default_enter_anim"
app:exitAnim="@anim/nav_default_exit_anim"
app:popEnterAnim="@anim/nav_default_pop_enter_anim"
app:popExitAnim="@anim/nav_default_pop_exit_anim"
app:popUpTo="@+id/a"
app:popUpToInclusive="true"/>
</fragment>
</navigation>
Когда навигационный граф раздувается, эти действия анализируются, и соответствующие объекты NavAction
генерируются с конфигурациями, определенными в графе. Например, action_b_to_a
определяется как переход от пункта назначения b
к пункту назначения a
. Действие включает в себя анимацию и поведение popTo
, которое удаляет все пункты назначения из стека. Все эти настройки фиксируются как NavOptions
и прикрепляются к NavAction
.
Чтобы следовать этому NavAction
, используйте NavController.navigate()
, передав идентификатор действия, как показано в следующем примере:
navController.navigate(R.id.action_b_to_a)
Применять параметры программно
В предыдущих примерах показано, как указать NavOptions
в XML-графике навигационного графа. Однако конкретные параметры могут различаться в зависимости от ограничений, которые неизвестны во время сборки. В таких случаях NavOptions
необходимо создать и установить программно, как показано в следующем примере:
Котлин
findNavController().navigate(
R.id.action_fragmentOne_to_fragmentTwo,
null,
navOptions { // Use the Kotlin DSL for building NavOptions
anim {
enter = android.R.animator.fade_in
exit = android.R.animator.fade_out
}
}
)
Ява
NavController navController = NavHostFragment.findNavController(this);
navController.navigate(
R.id.action_fragmentOne_to_fragmentTwo,
null,
new NavOptions.Builder()
.setEnterAnim(android.R.animator.fade_in)
.setExitAnim(android.R.animator.fade_out)
.build()
);
В этом примере используется расширенная форма navigate()
и содержатся дополнительные аргументы Bundle
и NavOptions
. Все варианты navigate()
имеют расширенные версии, принимающие аргумент NavOptions
.
Вы также можете программно применить NavOptions
при переходе к неявным глубоким ссылкам:
Котлин
findNavController().navigate(
deepLinkUri,
navOptions { // Use the Kotlin DSL for building NavOptions
anim {
enter = android.R.animator.fade_in
exit = android.R.animator.fade_out
}
}
)
Ява
NavController navController = NavHostFragment.findNavController(this);
navController.navigate(
deepLinkUri,
new NavOptions.Builder()
.setEnterAnim(android.R.animator.fade_in)
.setExitAnim(android.R.animator.fade_out)
.build()
);
Этот вариант navigate()
принимает Uri
для неявной глубокой ссылки, а также экземпляр NavOptions
.