Навигация с опциями,Навигация с опциями

Когда вы определяете действие в графе навигации с помощью 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 .