Navigation跳转Fragment时Toolbar先改标题再隐藏的问题如何修复
问题原因
你遇到的Toolbar闪烁是因为Navigation组件的setupActionBarWithNavController绑定逻辑会在导航动作触发后、目标Fragment生命周期执行前,优先根据导航图中目标节点配置的label属性自动更新Toolbar标题。而你把隐藏ActionBar的逻辑写在了第二个Fragment的onCreateView中,执行时机远晚于标题更新动作,就出现了先变标题再隐藏的视觉差。
修复方案
方案1:全局监听导航目的地变更(最推荐)
在宿主Activity的onCreate方法中给NavController添加OnDestinationChangedListener,在导航变更触发的第一时间判断目标页面是否需要隐藏Toolbar,提前执行显隐逻辑,不需要依赖Fragment的生命周期回调:
// 宿主Activity onCreate 中添加以下代码 val navController = findNavController(R.id.nav_host_fragment) // 原有初始化逻辑保留,比如setupActionBarWithNavController setupActionBarWithNavController(navController, appBarConfiguration) // 新增目的地变更监听 navController.addOnDestinationChangedListener { _, destination, _ -> when(destination.id) { R.id.secondFragment -> supportActionBar?.hide() else -> supportActionBar?.show() } }
修改完成后删除第二个FragmentonCreateView中的隐藏ActionBar代码,避免重复执行。
方案2:跳转前提前隐藏Toolbar
如果只有这一个跳转场景需要隐藏Toolbar,也可以在触发导航的位置先执行隐藏逻辑再跳转:
// FirstFragment 跳转逻辑处修改 (activity as AppCompatActivity).supportActionBar?.hide() findNavController().navigate(FirstFragmentDirections.navigateToSecondFragment(argument))
同时在FirstFragment的onResume中添加Toolbar恢复逻辑,避免返回后Toolbar不显示:
override fun onResume() { super.onResume() (activity as AppCompatActivity).supportActionBar?.show() }
如果你的项目中使用的是自定义Toolbar而非原生ActionBar,只需把上述代码中supportActionBar?.hide()/show()替换为自定义Toolbar的visibility属性控制即可。
内容的提问来源于stack exchange,提问作者LAO
相关产品推荐
相关产品推荐

