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

    文章

    503

    浏览量

    41839
  • 代码
    +关注

    关注

    30

    文章

    4603

    浏览量

    67383

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

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

收藏 人收藏

    评论

    相关推荐

    商汤科技与海通证券携手发布金融行业首个模态全式大模型

    商汤科技与海通证券联合研发并发布了金融行业内首个面向业务场景的模态全式大模型。双方计划将这一先进技术应用于智能问答、合规风控、代码辅助以及办公助手等关键业务领域,以实现大模型技术的全面落地。
    的头像 发表于 05-06 10:16 249次阅读

    商汤科技联合海通证券发布业内首个面向金融行业的模态全式大模型

    4月23日,商汤科技正式推出“日日新SenseNova 5.0”大模型体系,并与海通证券联合发布业内首个面向金融行业的模态全式大模型。
    的头像 发表于 04-26 09:48 244次阅读
    商汤科技联合海通证券发布业内首个面向金融行业的<b class='flag-5'>多</b>模态全<b class='flag-5'>栈</b>式大模型

    物联数据网关是什么?

    。 物联数据网关在物理层面上可以通过不同的通信协议与物联网设备进行通信,可以与多个物联网设备建立连接,同时处理多个设备的数据。 物联数据网关可以支持不同的物联网设备使用的不同协议,将不同协议的数据进行转换,
    的头像 发表于 03-29 17:10 155次阅读

    python函数返回多个参数

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

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

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

    使用MPLAB Harmony USB设备协议创建LUN USB海量存储类设备

    电子发烧友网站提供《使用MPLAB Harmony USB设备协议创建LUN USB海量存储类设备.pdf》资料免费下载
    发表于 09-25 11:00 0次下载
    使用MPLAB Harmony USB设备协议<b class='flag-5'>栈</b>创建<b class='flag-5'>多</b>LUN USB海量存储类设备

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

    月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

    卫星定位北斗芯片AT6558一款高性能BDS/GNSS模卫星导航接收机SOC单芯片

    1 芯片简介 AT6558R是一款高性能BDS/GNSS模卫星导航接收机SOC单芯片,片上集成射频前端,数字基带处理器,32位的RISCCPU,电源管理功能。 芯片支持多种卫星导航
    的头像 发表于 08-30 14:27 1014次阅读

    linux中的进程,线程,内核的区别

    大多数的处理器架构,都有实现硬件。有专门的指针寄存器,以及特定的硬件指令来完成 入/出 的操作。例如在 ARM 架构上,R13 (SP) 指针是堆栈指针寄存器,而 PUSH 是
    发表于 08-18 10:57 284次阅读
    linux中的进程<b class='flag-5'>栈</b>,线程<b class='flag-5'>栈</b>,内核<b class='flag-5'>栈</b>的区别

    TAU1201系统导航定位模块

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

    系统调用:用户与内核的切换(上)

    当发生系统调用、产生异常,外设发生中断等事件时,会发生用户和内核之间的切换, 本文从系统调用角度分析用户与内核的切换。 系统调用的演变 x86 的系统调用经历了 int / i
    的头像 发表于 07-31 11:27 690次阅读
    系统调用:用户<b class='flag-5'>栈</b>与内核<b class='flag-5'>栈</b>的切换(上)