• 欢迎访问搞代码网站,推荐使用最新版火狐浏览器和Chrome浏览器访问本网站!
  • 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏搞代码吧

导航-多返回栈-MAD-Skills

android 搞代码 4年前 (2022-03-01) 31次浏览 已收录 0个评论

欢送来到第二个对于导航的 MAD Skill 系列 的另一篇文章!本文咱们将介绍一个呼声很高的性能,即导航 (Navigation) 对多返回栈的反对。如果您更偏向于视频的模式,请 点击这里 查看视频内容。

概述

假如您的利用应用了 BottomNavigationView。通过这个性能,当用户抉择另一个标签页 (Tab) 时,以后标签页的返回栈会被保留,而所选标签页的返回栈会被复原。

从 2.4.0-alpha01 版本开始,NavigationUI 辅助类不须要扭转任何代码即可反对多返回栈。也就是说,如果您的利用应用了为 BottomNavigationViewNavigationView 提供的 setupWithNavController() 办法,则只须要更新依赖库版本,便可默认启用多返回栈。

反对多返回栈

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

该利用由 3 个标签页组成,每个标签页都有它本人的导航流。为了在导航的晚期版本中反对多返回栈,咱们须要在该示例的 NavigationExtensions 文件中增加一系列辅助函数。通过这些扩大函数,利用能够为每个标签页放弃一个独自的 NavHostFragment,每个 NavHostFragment 带有它本人的返回栈,当用户切换标签页时,利用在不同的 NavHostFragment 之间进行切换。

让咱们看看如果移除这些扩大函数会产生什么。为此我删除了 NavigationExtensions 类,在所有应用它的中央都替换为 NavigationUI 中规范的 setupWithNavController() 办法以将咱们的 BottomNavigationView 连贯到 NavController 上。

<code class="Kotlin">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

<code class="XML"><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 并察看每个底部导航行为测试的运行。

瞧,咱们所有测试都通过了!

小结

就是这样!如果您的利用应用 BottomNavigationViewNavigationView,并且您始终在期待反对多返回栈,您所须要做的仅仅是更新 navigation 和 fragment 依赖库,不须要扭转任何代码!

如果您须要进一步的自定义,也有新的 API 反对保留和复原返回栈。请参阅咱们之前的推文《Android 多返回栈技术详解》。

如果您想理解更多无关底层 API 以及须要批改哪些内容以反对多返回栈的信息,请参阅咱们之前的推文《全新的 Fragment: 应用新的状态管理器》。

感谢您关注本导航系列!

欢迎您 点击这里 向咱们提交反馈,或分享您喜爱的内容、发现的问题。您的反馈对咱们十分重要,感谢您的反对!


搞代码网(gaodaima.com)提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发送到邮箱[email protected],我们会在看到邮件的第一时间内为您处理,或直接联系QQ:872152909。本网站采用BY-NC-SA协议进行授权
转载请注明原文链接:导航-多返回栈-MAD-Skills

喜欢 (0)
[搞代码]
分享 (0)
发表我的评论
取消评论

表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址