导航: 多返回栈 | MAD Skills

2021 年 9 月 24 日 谷歌开发者

欢迎来到第二个关于导航的 MAD Skill 系列的另一篇文章!本文我们将介绍一个呼声很高的功能,即导航 (Navigation) 对多返回栈的支持。如果您更倾向于视频的形式,请查看以下视频内容:



概述


假设您的应用使用了 BottomNavigationView 。通过这个功能,当用户选择另一个标签页 (Tab) 时,当前标签页的返回栈会被保存,而所选标签页的返回栈会被恢复。

 

从 2.4.0-alpha01 版本开始, NavigationUI 辅助类不需要改变任何代码即可支持多返回栈。也就是说,如果您的应用使用了为 BottomNavigationView NavigationView 提供的 setupWithNavController() 方法,则只需要更新依赖库版本,便可默认启用多返回栈。
 


支持多返回栈


让我们通过 这个 仓库 中的高级导航示例来看看实际效果。

该应用由 3 个标签页组成,每个标签页都有它自己的导航流。为了在导航的早期版本中支持多返回栈,我们需要在该示例的 NavigationExtensions 文件中添加一系列辅助函数。通过这些扩展函数,应用可以为每个标签页保持一个单独的 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


让我们看看如果移除这些扩展函数会发生什么。为此我删除了 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 设置 bottomNavigationView       val bottomNavigationView = findViewById<BottomNavigationView>(R.id.bottom_nav)       bottomNavigationView.setupWithNavController(navController)        // 使用 navController 设置 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 个单独的导航图合并为一个图。现在我们的 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>

当我运行应用时,这次底部标签页不再保持它们的状态,并会在我切换到其他标签页时重置它的返回栈。由于移除了 NavigationExtensions ,该应用不再支持多返回栈。
 
现在我将更新 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 完成后,我再次运行应用,这时当我导航至其他标签页,可以看到每个标签页都保持了它的状态。注意这个行为是默认启用的。
 
最后,让我们运行测试来验证是否一切正常。该应用已经拥有一些验证多返回栈行为的测试。我运行 BottomNavigationTest 并观察每个底部导航行为测试的运行。
 
瞧,我们所有测试都通过了!


小结


就是这样!如果您的应用使用 BottomNavigationView NavigationView ,并且您一直在等待支持多返回栈,您所需要做的仅仅是更新 navigation 和 fragment 依赖库,不需要改变任何代码!
 
如果您需要进一步的自定义,也有新的 API 支持保存和恢复返回栈。请参阅我们之前的推文《 Android 多返回栈技术详解
 
如果您想了解更多有关底层 API 以及需要修改哪些内容以支持多返回栈的信息,请参阅我们之前的推文《全新的 Fragment: 使用新的状态管理器 》。
 
感谢您关注本导航系列!

欢迎您通过下方二维码向我们提交反馈,或分享您喜欢的内容、发现的问题。您的反馈对我们非常重要,感谢您的支持!




推荐阅读

如页面未加载,请刷新重试



 点击屏末  | 即刻了解多返回栈更多信息




登录查看更多
0

相关内容

Android(安卓)是一种以 Linux 为基础开发的开放源代码的操作系统,主要应用于便携设备。2005 年,Android 公司被 Google 收购,随后 Google 联合制造商组成开放手机联盟。Android 已从智能手机领域逐渐扩展到平板电脑、智能电视(及机顶盒)、游戏机、物联网、智能手表、车载系统、VR以及PC等领域。
联邦学习智慧医疗综述
专知会员服务
120+阅读 · 2021年11月27日
机器人运动轨迹的模仿学习综述
专知会员服务
44+阅读 · 2021年6月8日
【硬核书】终身机器学习,145页pdf
专知会员服务
83+阅读 · 2021年3月1日
专知会员服务
91+阅读 · 2020年12月26日
专知会员服务
39+阅读 · 2020年9月6日
专知会员服务
234+阅读 · 2020年1月23日
尤雨溪:Vue 3 将成为新的默认版本
InfoQ
0+阅读 · 2022年1月25日
Gradle 与 AGP 构建 API: 进一步完善您的插件!
谷歌开发者
0+阅读 · 2022年1月5日
Gradle 与 AGP 构建 API: 如何编写插件
谷歌开发者
0+阅读 · 2021年12月24日
Gradle 与 AGP 构建 API: 配置您的构建文件
谷歌开发者
0+阅读 · 2021年12月21日
获取数据并绑定到 UI | MAD Skills
谷歌开发者
0+阅读 · 2021年11月1日
Paging 3.0 简介 | MAD Skills
谷歌开发者
0+阅读 · 2021年10月29日
Hilt 工作原理 | MAD Skills
谷歌开发者
0+阅读 · 2021年10月18日
通过Termux打造免root安卓渗透工具
黑客技术与网络安全
16+阅读 · 2019年8月16日
已删除
将门创投
12+阅读 · 2017年10月13日
国家自然科学基金
0+阅读 · 2014年12月31日
国家自然科学基金
1+阅读 · 2013年12月31日
国家自然科学基金
0+阅读 · 2012年12月31日
国家自然科学基金
1+阅读 · 2012年12月31日
国家自然科学基金
1+阅读 · 2012年12月31日
国家自然科学基金
4+阅读 · 2012年12月31日
国家自然科学基金
0+阅读 · 2011年12月31日
国家自然科学基金
0+阅读 · 2011年12月31日
国家自然科学基金
0+阅读 · 2011年12月31日
国家自然科学基金
2+阅读 · 2011年12月31日
Self-Driving Cars: A Survey
Arxiv
41+阅读 · 2019年1月14日
VIP会员
相关VIP内容
联邦学习智慧医疗综述
专知会员服务
120+阅读 · 2021年11月27日
机器人运动轨迹的模仿学习综述
专知会员服务
44+阅读 · 2021年6月8日
【硬核书】终身机器学习,145页pdf
专知会员服务
83+阅读 · 2021年3月1日
专知会员服务
91+阅读 · 2020年12月26日
专知会员服务
39+阅读 · 2020年9月6日
专知会员服务
234+阅读 · 2020年1月23日
相关资讯
尤雨溪:Vue 3 将成为新的默认版本
InfoQ
0+阅读 · 2022年1月25日
Gradle 与 AGP 构建 API: 进一步完善您的插件!
谷歌开发者
0+阅读 · 2022年1月5日
Gradle 与 AGP 构建 API: 如何编写插件
谷歌开发者
0+阅读 · 2021年12月24日
Gradle 与 AGP 构建 API: 配置您的构建文件
谷歌开发者
0+阅读 · 2021年12月21日
获取数据并绑定到 UI | MAD Skills
谷歌开发者
0+阅读 · 2021年11月1日
Paging 3.0 简介 | MAD Skills
谷歌开发者
0+阅读 · 2021年10月29日
Hilt 工作原理 | MAD Skills
谷歌开发者
0+阅读 · 2021年10月18日
通过Termux打造免root安卓渗透工具
黑客技术与网络安全
16+阅读 · 2019年8月16日
已删除
将门创投
12+阅读 · 2017年10月13日
相关基金
国家自然科学基金
0+阅读 · 2014年12月31日
国家自然科学基金
1+阅读 · 2013年12月31日
国家自然科学基金
0+阅读 · 2012年12月31日
国家自然科学基金
1+阅读 · 2012年12月31日
国家自然科学基金
1+阅读 · 2012年12月31日
国家自然科学基金
4+阅读 · 2012年12月31日
国家自然科学基金
0+阅读 · 2011年12月31日
国家自然科学基金
0+阅读 · 2011年12月31日
国家自然科学基金
0+阅读 · 2011年12月31日
国家自然科学基金
2+阅读 · 2011年12月31日
Top
微信扫码咨询专知VIP会员