支援多個返回堆疊

Navigation 元件可與 Android 作業系統搭配運作,在使用者瀏覽應用程式時維持返回堆疊。在某些情況下,同時維持「多個返回堆疊」可協助使用者在堆疊之間來回移動。舉例來說,如果應用程式包含底部導覽導覽匣,多個返回堆疊的支援功能可讓使用者在應用程式流程之間任意切換,而不會因此在流程中失去所在位置。

Navigation 元件提供的 API 可在導覽圖表中儲存和還原目的地狀態,藉此支援多個返回堆疊。NavigationUI 類別包含可自動處理這個情況的方法,但您也可以手動使用基礎 API,進一步自訂實作項目。

使用 NavigationUI 自動實作支援功能

NavigationUI 類別包含的 API 可在使用者於選單項目之間移動時,自動儲存和還原選單項目狀態。根據預設,這些 API 會在以下情況實作多個返回堆疊支援功能:

這些 API 不需要進一步變更程式碼,即可實作多個返回堆疊支援功能,因此是為應用程式提供這項功能的建議做法。

使用基礎 API 手動實作支援功能

如果 NavigationUI 提供的元素不符合需求,您可以透過 Navigation 元件提供的其他 API 介面,使用基礎 API 儲存及還原返回堆疊。

在 Navigation XML 中,導覽圖表中的 <action> 元素可使用 app:popUpToSaveState 屬性,儲存相應動作使用 app:popUpTo 彈出的任何目的地狀態。此外,這些元素也可以使用 app:restoreState 屬性,還原先前在 app:destination 屬性所定義目的地中儲存的所有狀態。

您可以運用這些屬性支援多個返回堆疊。當導覽動作需要使用者在返回堆疊之間移動時,請在對應的 <action> 元素中,將 app:popUpToSaveStateapp:restoreState 都設為 true。如此一來,該動作會儲存目前返回堆疊的狀態,同時還原先前儲存的目的地返回堆疊狀態 (如有)。

以下範例為同時使用這兩種屬性的動作:

<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 進行導覽時儲存和還原返回堆疊。無論使用 Kotlin DSLNavOptions.Builder 建立 NavOptions 例項,都是如此:

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

如要進一步瞭解如何傳遞導覽選項,請參閱「以程式輔助方式套用 NavOptions」。

其他資源

如要進一步瞭解 Navigation 元件的多個返回堆疊支援功能,請參閱以下額外資源:

網誌文章

範例