Navigation 元件可與 Android 作業系統搭配運作,在使用者瀏覽應用程式時維持返回堆疊。在某些情況下,同時維持「多個返回堆疊」可協助使用者在堆疊之間來回移動。舉例來說,如果應用程式包含底部導覽或導覽匣,多個返回堆疊的支援功能可讓使用者在應用程式流程之間任意切換,而不會因此在流程中失去所在位置。
Navigation 元件提供的 API 可在導覽圖表中儲存和還原目的地狀態,藉此支援多個返回堆疊。NavigationUI
類別包含可自動處理這個情況的方法,但您也可以手動使用基礎 API,進一步自訂實作項目。
使用 NavigationUI 自動實作支援功能
NavigationUI
類別包含的 API 可在使用者於選單項目之間移動時,自動儲存和還原選單項目狀態。根據預設,這些 API 會在以下情況實作多個返回堆疊支援功能:
- 當您使用適當的
setupWithNavController()
超載,在NavigationView
或BottomNavigationView
例項與NavController
例項之間建立關聯時,就如「新增導覽匣」或「底部導覽列」中所述。 - 當您使用
onNavDestinationSelected()
建立自訂導覽選單 UI,且該 UI 是連結至由NavController
例項代管的目的地時。
這些 API 不需要進一步變更程式碼,即可實作多個返回堆疊支援功能,因此是為應用程式提供這項功能的建議做法。
使用基礎 API 手動實作支援功能
如果 NavigationUI
提供的元素不符合需求,您可以透過 Navigation 元件提供的其他 API 介面,使用基礎 API 儲存及還原返回堆疊。
Navigation XML
在 Navigation XML 中,導覽圖表中的 <action>
元素可使用 app:popUpToSaveState
屬性,儲存相應動作使用 app:popUpTo
彈出的任何目的地狀態。此外,這些元素也可以使用 app:restoreState
屬性,還原先前在 app:destination
屬性所定義目的地中儲存的所有狀態。
您可以運用這些屬性支援多個返回堆疊。當導覽動作需要使用者在返回堆疊之間移動時,請在對應的 <action>
元素中,將 app:popUpToSaveState
和 app: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
NavOptions
類別可讓您傳遞特殊的導覽選項,在使用 NavController
進行導覽時儲存和還原返回堆疊。無論使用 Kotlin DSL 或 NavOptions.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 元件的多個返回堆疊支援功能,請參閱以下額外資源:
網誌文章
- MAD Skills:導覽多個返回堆疊 在 Medium 上
- 導覽:多個返回堆疊深入探索 在 Medium 上
範例
- Android 即時情報 應用程式 GitHub 上
- Jetnews GitHub 上
- Jetsnack GitHub 上