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

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

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

Автоматическая реализация поддержки с помощью NavigationUI.

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

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

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

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

В XML-коде навигации элементы <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 :

Котлин

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

Ява

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);

Дополнительные сведения о передаче параметров навигации см. в разделе Программное применение NavOptions .

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

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

Сообщения в блоге

Образцы