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

    文章

    570

    浏览量

    43725
  • 代码
    +关注

    关注

    30

    文章

    4941

    浏览量

    73150

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

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

收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    Stack到底用来干嘛的呢?

    我们在函数的局部变量、数组这些不能超过1K(含嵌套的函数),否则程序就会崩溃进入hardfaul。 除了这些局部变量以外,还有一些实时操作系统的现场保护、返回地址都是存储在里面。 还有一点题外话,就是的增长方向是从高地址到低
    发表于 12-01 08:04

    电能质量在线监测装置支持平台数据推送吗?

    和技术细节: 一、核心技术支撑 协议并行支持 主流装置通常内置多种通信协议,可同时激活多个协议向不同平台推送数据。例如: 工业协议 :Modbus TCP(用于 SCADA 系统)、IEC 61850 MMS(用于智能变电站
    的头像 发表于 11-07 09:59 391次阅读

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

    ,可以同时接收六个卫星导航系统的 GNSS 信号,并且实现联合定位、导航与授时。二、AT6558的功能概述: 支持 BDS/GPS/GLONASS 卫星导航系统的单系统定位,以及任
    发表于 09-29 09:54

    SkyLiTE™ 高频段频段功率放大器模块,支持 LTE 高级应用 skyworksinc

    电子发烧友网为你提供()SkyLiTE™ 高频段频段功率放大器模块,支持 LTE 高级应用相关产品参数、数据手册,更有SkyLiTE™ 高频段
    发表于 09-24 18:35
    SkyLiTE™ 高频段<b class='flag-5'>多</b>模<b class='flag-5'>多</b>频段功率放大器模块,<b class='flag-5'>支持</b> LTE 高级应用 skyworksinc

    AT6558R:高性能模卫星导航芯片的全面解析

    前端、数字基带处理器、32位RISC CPU和电源管理模块,还支持中国北斗(BDS)、美国GPS、俄罗斯GLONASS等系统联合定位,为各类设备提供精准可靠的定位服务。‌ 其创新架构确保了在复杂环境下的稳定性,是现代导航和物联
    的头像 发表于 07-24 15:30 785次阅读
    AT6558R:高性能<b class='flag-5'>多</b>模卫星<b class='flag-5'>导航</b>芯片的全面解析

    MEMS组合导航系统能否成为领域导航的“全能王者”?

    在现代化作业场景中,高精度、高可靠性的导航系统已成为各领域不可或缺的核心设备。ER-GNSS/MINS-01 MEMS组合导航系统作为一款将卫星定位与惯性测量技术融合的创新产品,犹如一颗璀璨的新星
    的头像 发表于 07-21 15:57 787次阅读
    MEMS组合<b class='flag-5'>导航</b>系统能否成为<b class='flag-5'>多</b>领域<b class='flag-5'>导航</b>的“全能王者”?

    智能时代的“导航大脑”:组合导航技术为何不可或缺?

    当自动驾驶精准停入暴雨中的车位,无人机穿越城市峡谷锁定目标,AUV在无卫星信号的海底保持航向——这些场景的背后,是组合导航技术在默默支撑。它融合卫星、惯性等源数据,重新定义了人类对时空的掌控力。但为何它能在众多导航方案中脱颖而
    的头像 发表于 07-11 16:21 564次阅读
    智能时代的“<b class='flag-5'>导航</b>大脑”:组合<b class='flag-5'>导航</b>技术为何不可或缺?

    组合导航系统如何实现源融合破解单一导航局限

    无论是自动驾驶汽车、无人机巡检,还是精准农业、飞行记录仪,高精度、高可靠的导航都是核心需求。然而,传统导航技术各有短板:卫星导航(GNSS):信号易受遮挡(如城市峡谷、隧道),且易受干扰或欺骗。惯性
    的头像 发表于 07-10 16:58 712次阅读
    组合<b class='flag-5'>导航</b>系统如何实现<b class='flag-5'>多</b>源融合破解单一<b class='flag-5'>导航</b>局限

    【汇思博SEEK100开发板试用体验】06 天气app--使用组件导航实现设置页及页面跳转

    支持在不同组件间传递跳转参数,提供灵活的跳转操作,从而更便捷地实现对不同页面的访问和复用。本文将从组件导航(Navigation)的显示模式、路由操作、子页面管理、跨包跳转以及跳转动效等几个方面进行
    发表于 07-09 16:57

    AT2659模卫星导航射频放大器技术解析与应用

    电路,完全符合RoHS环保标准,适用于各类对尺寸和功耗敏感的导航设备。 技术特性详解 系统兼容性 该芯片支持1550MHz~1615MHz工作频段,完整覆盖: 中国北斗系统(BDS) L1频段
    的头像 发表于 06-26 16:19 503次阅读
    AT2659<b class='flag-5'>多</b>模卫星<b class='flag-5'>导航</b>射频放大器技术解析与应用

    AT2659导航芯片技术解析

    引言:系统兼容导航芯片的微型化突破       随着北斗BDS、GPS等全球导航系统终端向高集成度发展,AT2659凭借SiGe工艺在1.5mm×1mm的超小封装内实现了23dB增益与0.71dB
    的头像 发表于 06-17 11:43 571次阅读
    AT2659<b class='flag-5'>多</b>模<b class='flag-5'>导航</b>芯片技术解析

    深入浅出解析低功耗蓝牙协议

    深入Bluetooth LE协议各个组成部分之前,我们先看一下Bluetooth LE协议整体架构。 如上图所述,要实现一个Bluetooth LE应用,首先需要一个支持Bluetooth
    的头像 发表于 04-09 14:49 1008次阅读
    深入浅出解析低功耗蓝牙协议<b class='flag-5'>栈</b>

    GNSS模定位导航模块数据手册:ATGH336H-6N74

    、无人机等应用领域。 ATGM336H-6N系列模块产品基于中科微第六代系统GNSS SOC单芯片AT6668,支持多种卫星导航系统,包括北斗二号和北斗三
    的头像 发表于 02-11 15:26 1521次阅读
    GNSS<b class='flag-5'>多</b>模定位<b class='flag-5'>导航</b>模块数据手册:ATGH336H-6N74

    如何把两个数据返回给调用函数

    函数的处理结果包含两个数据,如何把两个数据返回给调用函数? 第一种,把两个数据封装成一个结构体,函数返回结构体。 调用函数的地方同样用结构体去接收函数的返回值。 第二种,把返回值保存在
    的头像 发表于 01-08 10:15 678次阅读

    AT6558R-5N32:高性能BDS/GNSS模卫星车载导航接收机SOC单芯片

    AT6558R:高性能BDS/GNSS模卫星导航接收机SOC单芯片,支持北斗、GPS 等系统联合定位,集成射频前端、数字基带处理器、32位RISC CPU和电源管理功能,功耗低,封
    的头像 发表于 12-24 15:24 2143次阅读
    AT6558R-5N32:高性能BDS/GNSS<b class='flag-5'>多</b>模卫星车载<b class='flag-5'>导航</b>接收机SOC单芯片