使用Navigation导航时新旧Fragment工具栏标题同步变更如何解决?
问题根因
你在子Fragment中调用了setSupportActionBar将当前Fragment的Toolbar绑定为Activity全局的ActionBar实例,整个应用全局只会持有一个ActionBar对象,当你在新Fragment修改标题后,返回旧Fragment时旧Fragment没有主动重置ActionBar的标题,就会出现标题被覆盖的问题。
解决方案
方案1:Fragment独立管理自有Toolbar(推荐,适用于每个Fragment都自带Toolbar的架构)
不要在子Fragment中将自己的Toolbar绑定到Activity的ActionBar,直接在当前Fragment内部处理Toolbar的标题和返回逻辑即可,修改子Fragment代码如下:
override fun onActivityCreated(savedInstanceState: Bundle?) { super.onActivityCreated(savedInstanceState) // 删掉绑定Activity ActionBar的两行代码,避免影响全局 // 自行处理返回按钮点击 binding.toolbar.setNavigationOnClickListener { findNavController().popBackStack() } if (args.action == null) { binding.toolbar.title = requireActivity().getString(R.string.menu_create_new_action) } else { binding.toolbar.title = requireActivity().getString(R.string.menu_edit_action) } }
方案2:旧Fragment生命周期中主动重置标题
如果你的架构是全局共用Activity的ActionBar,那么可以在旧Fragment的onResume生命周期中主动重置标题,确保返回时标题正确:
// 旧Fragment(比如MainFragment)中添加如下代码 override fun onResume() { super.onResume() (requireActivity() as AppCompatActivity).supportActionBar?.title = getString(R.string.menu_timers) }
方案3:使用Navigation组件官方自动绑定能力(推荐,适用于全局共用一个Toolbar的架构)
你已经在导航图中为每个节点配置了android:label属性,直接在Activity中完成Navigation和ActionBar的绑定,无需手动在每个Fragment设置标题,框架会自动在页面切换时更新/恢复标题:
// 只需要在主Activity的onCreate方法中添加如下配置 val navController = findNavController(R.id.nav_host_fragment) // 替换为你自己的NavHost id val appBarConfiguration = AppBarConfiguration(navController.graph, drawerLayout) // 传入你的DrawerLayout实例实现汉堡菜单联动 setupActionBarWithNavController(navController, appBarConfiguration)
如果需要动态修改标题(比如编辑页区分新建/编辑状态),只需要在Fragment中调用如下代码即可,无需直接操作ActionBar:
if (args.action == null) { findNavController().currentDestination?.label = getString(R.string.menu_create_new_action) } else { findNavController().currentDestination?.label = getString(R.string.menu_edit_action) }
内容的提问来源于stack exchange,提问作者Alex
相关产品推荐
相关产品推荐

