歡迎來到第二個關(guān)于導航的 MAD Skill 系列的另一篇文章!本文我們將介紹一個呼聲很高的功能,即導航 (Navigation) 對多返回棧的支持。如果您更傾向于視頻的形式,請查看以下視頻內(nèi)容:
概述
假設(shè)您的應用使用了 BottomNavigationView。通過這個功能,當用戶選擇另一個標簽頁 (Tab) 時,當前標簽頁的返回棧會被保存,而所選標簽頁的返回棧會被恢復。
從 2.4.0-alpha01 版本開始,NavigationUI 輔助類不需要改變?nèi)魏未a即可支持多返回棧。也就是說,如果您的應用使用了為 BottomNavigationView 或 NavigationView 提供的 setupWithNavController() 方法,則只需要更新依賴庫版本,便可默認啟用多返回棧。
支持多返回棧
讓我們通過這個倉庫中的高級導航示例來看看實際效果。
該應用由 3 個標簽頁組成,每個標簽頁都有它自己的導航流。為了在導航的早期版本中支持多返回棧,我們需要在該示例的 NavigationExtensions 文件中添加一系列輔助函數(shù)。通過這些擴展函數(shù),應用可以為每個標簽頁保持一個單獨的 NavHostFragment,每個 NavHostFragment 帶有它自己的返回棧,當用戶切換標簽頁時,應用在不同的 NavHostFragment 之間進行切換。
倉庫
https://github.com/android/architecture-components-samples/tree/master/NavigationAdvancedSample
NavigationExtensions
https://github.com/android/architecture-components-samples/blob/8f4936b34ec84f7f058fba9732b8692e97c65d8f/NavigationAdvancedSample/app/src/main/java/com/example/android/navigationadvancedsample/NavigationExtensions.kt
讓我們看看如果移除這些擴展函數(shù)會發(fā)生什么。為此我刪除了 NavigationExtensions 類,在所有使用它的地方都替換為 NavigationUI 中標準的 setupWithNavController() 方法以將我們的 BottomNavigationView 連接到 NavController 上。
class MainActivity : AppCompatActivity()
{ private lateinit var navController: NavController private lateinit var appBarConfiguration: AppBarConfiguration override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main) val navHostFragment = supportFragmentManager.findFragmentById( R.id.nav_host_container ) as NavHostFragment navController = navHostFragment.navController
// 使用 navController 設(shè)置 bottomNavigationView val bottomNavigationView = findViewById《BottomNavigationView》(R.id.bottom_nav) bottomNavigationView.setupWithNavController(navController)
// 使用 navController 設(shè)置 ActionBar 以及 3 個一級目的地頁面 appBarConfiguration = AppBarConfiguration( setOf(R.id.titleScreen, R.id.leaderboard, R.id.register) ) val toolbar = findViewById《Toolbar》(R.id.toolbar) setSupportActionBar(toolbar) toolbar.setupWithNavController(navController, appBarConfiguration) } override fun onSupportNavigateUp(): Boolean { return navController.navigateUp(appBarConfiguration)
}}
同時,我使用 include 標簽將 3 個單獨的導航圖合并為一個圖?,F(xiàn)在我們的 Activity 布局只包含一個帶有單個導航圖的 NavHostFragment。
《navigation xmlns:android=“http://schemas.android.com/apk/res/android” xmlns:app=“http://schemas.android.com/apk/res-auto” android:id=“@+id/nav_graph” app:startDestination=“@+id/home”》
《include app:graph=“@navigation/home”/》 《include app:graph=“@navigation/list”/》 《include app:graph=“@navigation/form”/》
《/navigation》
當我運行應用時,這次底部標簽頁不再保持它們的狀態(tài),并會在我切換到其他標簽頁時重置它的返回棧。由于移除了 NavigationExtensions,該應用不再支持多返回棧。 現(xiàn)在我將更新 navigation 和 fragment 依賴庫的版本。
// fragment 最新版本 https://developer.android.google.cn/jetpack/androidx/releases/fragment?hl=en// navigation 最新版本 https://developer.android.google.cn/jetpack/androidx/releases/navigation?hl=en
versions.fragment = “1.4.0-alphaXXX”versions.navigation = “2.4.0-alphaXXX”
Gradle sync 完成后,我再次運行應用,這時當我導航至其他標簽頁,可以看到每個標簽頁都保持了它的狀態(tài)。注意這個行為是默認啟用的。 最后,讓我們運行測試來驗證是否一切正常。該應用已經(jīng)擁有一些驗證多返回棧行為的測試。我運行 BottomNavigationTest 并觀察每個底部導航行為測試的運行。 瞧,我們所有測試都通過了!
小結(jié)
就是這樣!如果您的應用使用 BottomNavigationView 或 NavigationView,并且您一直在等待支持多返回棧,您所需要做的僅僅是更新 navigation 和 fragment 依賴庫,不需要改變?nèi)魏未a! 如果您需要進一步的自定義,也有新的 API 支持保存和恢復返回棧。請參閱我們之前的推文《Android 多返回棧技術(shù)詳解》。 如果您想了解更多有關(guān)底層 API 以及需要修改哪些內(nèi)容以支持多返回棧的信息,請參閱我們之前的推文《全新的 Fragment: 使用新的狀態(tài)管理器》。 感謝您關(guān)注本導航系列!
責任編輯:haq
-
導航
+關(guān)注
關(guān)注
7文章
518瀏覽量
42337 -
代碼
+關(guān)注
關(guān)注
30文章
4727瀏覽量
68248
原文標題:導航: 多返回棧 | MAD Skills
文章出處:【微信號:Google_Developers,微信公眾號:谷歌開發(fā)者】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
相關(guān)推薦
評論