Поддержка нескольких обратных стеков

Компонент навигации работает с операционной системой Android, чтобы поддерживать обратный стек, когда пользователь перемещается по приложению. В некоторых случаях может быть полезно поддерживать несколько обратных стеков одновременно, чтобы пользователь мог перемещаться между ними. Например, если в вашем приложении есть нижняя панель навигации или боковое меню, поддержка нескольких обратных стеков позволит пользователям свободно переключаться между разделами приложения, не теряя прогресс ни в одном из них.

Компонент Navigation предоставляет API, которые поддерживают несколько обратных стеков, сохраняя и восстанавливая состояние пунктов назначения в вашем графе навигации. Класс NavigationUI включает методы, которые обрабатывают это автоматически, но вы также можете использовать базовые API вручную для более индивидуальной реализации.

Как реализовать поддержку автоматически с помощью NavigationUI

Класс NavigationUI включает API, которые автоматически сохраняют и восстанавливают состояние пунктов меню, когда пользователь перемещается между ними. Эти API по умолчанию реализуют поддержку нескольких обратных стеков в следующих случаях:

Эти API не требуют дополнительных изменений кода для реализации поддержки нескольких обратных стеков и являются рекомендуемым способом поддержки нескольких обратных стеков в вашем приложении.

Как реализовать поддержку вручную с помощью базовых API

Если элементы, предоставляемые NavigationUI, не соответствуют вашим требованиям, вы можете использовать базовые API для сохранения и восстановления обратных стеков через одну из других поверхностей API, предоставляемых компонентом навигации.

В XML-файле Navigation элементы <action> в графе навигации могут использовать атрибут app:popUpToSaveState, чтобы сохранять состояние любых пунктов назначения, которые действие извлекло с помощью app:popUpTo. Они также могут использовать атрибут app:restoreState, чтобы восстановить любое ранее сохраненное состояние для целевого объекта, определенного в атрибуте app:destination.

Эти атрибуты можно использовать для поддержки нескольких обратных стеков. Если при навигации пользователь должен перейти из одного обратного стека в другой, задайте для app:popUpToSaveState и app:restoreState значение true в соответствующем элементе <action>. Таким образом, действие сохраняет состояние текущего обратного стека, а также восстанавливает ранее сохраненное состояние целевого обратного стека, если оно существует.

В примере ниже показано действие, в котором используются оба этих атрибута:

<action
  android:id=”@+id/swap_stack”
  app:destination=”@id/second_stack”
  app:restoreState=”true”
  app:popUpTo=”@id/first_stack_start_destination”
  app:popUpToSaveState=”true” />

Класс NavOptions позволяет передавать специальные параметры навигации для сохранения и восстановления обратных стеков при навигации с помощью NavController. Это правило действует независимо от того, создаете ли вы экземпляр NavOptions с помощью Kotlin DSL или NavOptions.Builder.

Kotlin

// Use the navigate() method that takes a navOptions DSL Builder
navController.navigate(selectedBottomNavRoute) {
  launchSingleTop = true
  restoreState = true
  popUpTo(navController.graph.findStartDestination().id) {
    saveState = true
  }
}

Java

NavOptions navOptions = new NavOptions.Builder()
  .setLaunchSingleTop(true)
  .setRestoreState(true)
  .setPopUpTo(NavGraph.findStartDestination(navController.getGraph()).getId(),
    false, // inclusive
    true) // saveState
  .build();
navController.navigate(selectedBottomNavId, null, navOptions);

Подробнее о том, как передавать параметры навигации…

Дополнительные ресурсы

Чтобы узнать больше о поддержке нескольких обратных стеков с помощью компонента Navigation, ознакомьтесь со следующими дополнительными материалами:

Записи в блоге

Образцы