关于标题
Navigation:用于fragment见的跳转
AppBarLayout:用于构建一个和滑动联动的toolbar
BottomNavigationView:一个底部导航栏,用于切换多个fragment
RecyclerView:列表展示
本标题的含义是:如何处理多个fragment之间顶部toolbar的联动,本示例场景:
fragmentA是一个列表,列表滑动的时候toolbar折叠。
fragmentB和C简单的页面,此页面toolbar显示。
解决的问题:当fragmentA中toolbar折叠后,切到B和C时,toolbar依旧处于折叠状态:

而最终我们要达成的效果是这样:

ps:这里的前提是是使用toolbar,而不是自己再xml里写一个头部布局。使用AppBarLayout和toolbar并设置相应的behavior就能达到这种标题栏和滑动的联动效果。
解决办法:
我们需要在管理这些fragment的activity里添加关于BottomNavigationView的监听,通过判断不同的页面id从而来达到不同fragment的效果:
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
val navController = Navigation.findNavController(this, R.id.fragment_container)
NavigationUI.setupWithNavController(nv_bottom, navController)
//BottomNavigationView的监听
nv_bottom.setOnNavigationItemSelectedListener {
if (it.itemId == R.id.navigation_dashboard || it.itemId == R.id.navigation_notifications){
//展开标题栏,appbar为AppbarLayou的id
appbar.setExpanded(true)
}
return@setOnNavigationItemSelectedListener NavigationUI.onNavDestinationSelected(it, navController)
}
}
注意:
在实现BottomNavigationView的监听的时候,如果你也使用了NavigationUI+BottomNavigationView这样的模式来进行跳转,应该注意的是NavigationUI.setupWithNavController()这个方法里本身就已经 实现了BottomNavigationView的监听倒不如说,NavigationUI联动BottomNavigationView的基本原理就是实现了他的监听。所以在我们自己实现BottomNavigationView的监听时,要把NavigationUI.setupWithNavController()的调用放在自己实现的监听的前面,然后再模仿其内部返回调用NavigationUI.onNavDestinationSelected方法的值。

网友评论