BottomNavigationView
使用最新的Navigation Component,NavController
现在默认保存和恢复选项卡的状态:
作为此更改的一部分,onNavDestinationSelected()、BottomNavigationView.setupWithNavController()和NavigationView.setupWithNavController()的NavigationUI方法现在可以自动保存和恢复弹出目标的状态,从而支持多个反向堆栈,而无需更改任何代码。
这太棒了!现在切换标签页会给你最后一次查看的堆栈。
但是,如果用户重新选择一个选项卡,假设他们已经转到Home -> Detail Page A -> Detail Page B
,然后他们选择Home
选项卡,希望返回默认视图,他们仍然看到Detail Page B
。
似乎讨论的一部分是处理issue tracker中提到的“重新选择选项卡”行为,但我不知道实现这一点的推荐方法。
NavigationAdvancedSample所包含的全部功能如下:
val bottomNavigationView = findViewById<BottomNavigationView>(R.id.bottom_nav)
bottomNavigationView.setupWithNavController(navController)
// Setup the ActionBar with navController and 3 top level destinations
appBarConfiguration = AppBarConfiguration(
setOf(R.id.titleScreen, R.id.leaderboard, R.id.register)
)
setupActionBarWithNavController(navController, appBarConfiguration)
这只是恢复以前的状态,如发行说明中所述。
我们怎样才能检查第二次点击导航栏项目并清除后栈?
6条答案
按热度按时间tkclm6bt1#
BottomNavigationView
有其自己的方法,用于通过setOnItemReselectedListener()
(或者,当使用早期版本的材质设计库时,使用现在不建议使用的setOnNavigationItemReselectedListener()
)处理重新选择。bottomNavigationView.setupWithNavController
没有设置这个监听器(因为没有Material规范来明确说明重新选择一个选项卡应该做什么),所以你需要自己设置它:swvgeqrz2#
这个被接受的答案让我朝着正确的方向开始了。然而,随着Android导航库2.4.0支持的多个backstack的增加,这是最终对我有效的:
uinbv5nw3#
有两种方法可以拯救我们...
1.在选定项目后更新选择(具有反向堆栈的项目,使用最新版本-2.4.2,当顶部目标中存在反向堆栈时,选择该项目不会首先选择该项目)。
NavigationBarView.setOnItemSelectedListener {}
1.等待第二次单击并执行向后堆栈的弹出。
NavigationBarView.setOnItemReselectedListener {}
最终代码是,
}
希望这会有帮助。
qgzx9mmu4#
此解决方案由Callie's和ianhanniballake's解决方案组成。
行为是
Home -> Detail Page A -> Detail Page B
,然后按下Home button
-〉Home
Home -> Detail Page A -> Detail Page B
,然后导航至Profile
,然后返回Home
将显示Detail Page B
,然后再次按下Home
将触发1行为(因此将返回Home
屏幕)。egmofgnx5#
使用您自己的
setupWithNavController2
,而不是androidx.navigation.ui.BottomNavigationViewKt
中的setupWithNavController
例如:
在导航之前添加了已选定项目的检查:
参见
onNavDestinationSelected
的注解,setupWithNavController2
的完整代码:kuhbmx9i6#
你必须显示底部导航栏只为
R.id.titleScreen, R.id.leaderboard, R.id.register
片段,对于其他人,它应该是隐藏的,他们应该只有工具栏与后退按钮