При определении действия в графе навигации с использованием Kotlin DSL, Navigation генерирует соответствующий класс NavAction , который содержит конфигурации, определенные для этого действия, включая следующие:
- Назначение : Идентификатор ресурса целевого назначения.
- Аргументы по умолчанию : Объект
android.os.Bundle, содержащий значения по умолчанию для целевого объекта, если они указаны. - Параметры навигации : Параметры навигации, представленные как
NavOptions. Этот класс содержит все специальные настройки для перехода к целевому пункту назначения и обратно, включая конфигурацию ресурсов анимации, поведение всплывающих окон и то, следует ли запускать пункт назначения в режиме одного окна.
Параметры при создании
По умолчанию 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() , передав ID действия, как показано в следующем примере:
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
}
}
)
Java
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
}
}
)
Java
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 .