0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

导航对多返回栈的支持

谷歌开发者 来源:Android 开发者 作者:Android 2021-09-29 11:21 次阅读

欢迎来到第二个关于导航的 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: 使用新的状态管理器》。 感谢您关注本导航系列!

责任编辑:haq

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 导航
    +关注

    关注

    7

    文章

    502

    浏览量

    41416
  • 代码
    +关注

    关注

    30

    文章

    4536

    浏览量

    66497

原文标题:导航: 多返回栈 | MAD Skills

文章出处:【微信号:Google_Developers,微信公众号:谷歌开发者】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    python函数返回多个参数

    函数是程序设计中的一个重要概念,在很多编程语言中都存在。函数可以接受输入数据,并且根据输入数据进行一系列操作,最后可以返回一个或多个结果。Python是一种非常流行的编程语言,也支持函数返回多个参数
    的头像 发表于 11-21 16:37 390次阅读

    tuple函数怎么返回多个值

    在编程领域中,函数是非常重要的构建模块,它能够接受输入参数并执行特定的计算,最终返回结果供程序使用。常规的函数只能返回一个值,但有时我们希望函数能够返回多个值,以便更好地处理问题。Python
    的头像 发表于 11-21 16:33 248次阅读

    鸿蒙原生应用开发-关于页面接口router返回问题与解决思路

    router.back():返回上一页面或指定页面。 router.clear():清空页面中的所有历史页面,仅保留当前页面作为顶页面 ...... 详细见文档:https
    发表于 11-15 10:11

    C语言函数返回1和返回0究竟哪个好?

    C语言函数返回1和返回0究竟哪个好? 在C语言中,很多函数需要返回一个值来表示函数是否成功执行。而在很多情况下,通常会选择让函数返回1或0,以表示成功或失败。但是,有些人可能会觉得这样
    的头像 发表于 10-31 14:43 414次阅读

    智能轮椅导航定位的研究现状及趋势

    电动轮椅,融合多种领域的研究,包括机器视觉,机器人导航和定位.模式识别,传感器融合及用户接口等。目前美国、德国.日本、及中国等多个国家都在进行这方面的研究。 轮椅的安全导航,是智能轮椅要解决的中心
    发表于 09-25 07:13

    海外厂商占过半份额,华大北斗力争导航芯片突围

    月6日在深圳成立。专注从事导航定位芯片、算法及产品的自主设计、研发、销售及相关业务。 作为国家级高新技术企业,华大北斗自主设计研发了“全球首颗支持北斗三号信号体制的系统频基带射频一
    发表于 09-18 14:14

    TAU1201 频标准精度定位模块

    应用提供高精度、高灵敏性、低功耗的解决方案。 • 支持所有民用导航卫星系统,支持北斗三号信号体制 • 同时接收 L1、L5 双频模信号 • 显著提高卫星定位精度至亚米级,优异的抗
    发表于 09-11 09:36

    TAU1308 系统 RTK 定位模块

    TAU1308 是一款基于 HD9301 GNSS 芯片开发而成的系统 RTK模块,支持全球所有民用导航卫星系统(GPS、BDS、GLONASS、Galileo 和 QZSS),提供高精度的定位
    发表于 09-07 14:20

    TAU1312 系统频 RTK 定位模块

    TAU1312 是一款高性能的系统双频 RTK 定位模块,搭载了华大北斗的CYNOSURE III GNSS SoC 芯片。该模块支持新一代北斗三号信号体制 , 同时支持全球所有民用导航
    发表于 09-06 09:54

    STM32WB产品详解及FUS无线协议升级

    STM32WB产品详解及FUS无线协议升级2.4GHz无线双核STM32WB, 采用SoC单芯片设计,支持协议射频。
    发表于 09-06 06:35

    TAU1201系统导航定位模块

    : 1.支持所有民用导航卫星系统,支持北斗三号信号体制(B1C,B2a) 2.同时接收L1、L5双频模信号 3.显著提高卫星定位精度至亚米级,优异的抗
    发表于 08-09 15:30

    卫星导航低噪声放大器芯片

    电流:4.4mA; * 宽供电电压范围:1.4V ~ 3.6V; * 所有管脚支持2.5KV HBM ESD保护 * 内部集成的50Ω输出匹配电路; * 外围电路简单应用* 导航设备 * 可穿
    发表于 06-25 11:43

    如何设计API返回码(错误码)?

    客户端请求API,通常需要通过返回码来判断API返回的结果是否符合预期,以及该如何处理返回的内容等
    的头像 发表于 05-15 09:05 510次阅读
    如何设计API<b class='flag-5'>返回</b>码(错误码)?

    C语言中函数的返回值指向一个指针

    函数的返回值类型必须与函数体内的返回表达式的类型相匹配。如果类型不匹配,编译器会报错。此外,C 语言中的函数只能返回一个值,如果需要返回多个值,可以使用结构体或指针等方式来实现。
    的头像 发表于 04-26 11:01 1905次阅读
    C语言中函数的<b class='flag-5'>返回</b>值指向一个指针

    什么是函数的返回值?

    函数的返回值是函数被调用后,执行所调用函数内代码后所得出的结果,并且将返回给主函数的值。
    的头像 发表于 04-04 17:21 3369次阅读