Android开发:为Fragment配置Toolbar时出现双重操作栏如何合并解决
双操作栏重复生成的核心原因
- 两套独立的菜单加载逻辑同时生效,触发了两层操作栏的渲染:
- 在Fragment的
onCreate中调用setHasOptionsMenu(true)后,宿主Activity自带的系统默认ActionBar会自动接收Fragment提交的菜单项,渲染出第一层不属于你Fragment布局的操作栏 - 在Fragment的
onCreateView中给布局内的Toolbar调用toolbar.inflateMenu(R.menu.menu),独立渲染出第二层属于Fragment布局内部的操作栏
- 在Fragment的
- 叠加宿主Activity使用了带默认ActionBar的主题,没有做禁用配置,最终就出现了两个并存的操作栏。
修复方案
根据自己的UI结构二选一,禁止两套逻辑混用:
方案1:使用Fragment布局内的独立Toolbar(适配当前Fragment需要独立操作栏的场景)
- 全局禁用宿主Activity的系统默认ActionBar,在应用主题中添加配置:
<item name="windowActionBar">false</item> <item name="windowNoTitle">true</item> - 删除Fragment的
onCreate方法中setHasOptionsMenu(true)这行代码,彻底关闭Fragment向Activity全局ActionBar提交菜单的通道 - 保留现有代码逻辑即可:绑定布局内的Toolbar、给Toolbar加载自定义菜单、绑定菜单项点击监听
方案2:复用Activity全局统一Toolbar(适配全页面共用同一个顶部操作栏的场景)
- 同样在主题中禁用系统默认ActionBar,在Activity根布局中定义全局Toolbar,通过
setSupportActionBar(toolbar)将系统ActionBar替换为该自定义Toolbar - 删除Fragment布局中单独定义的Toolbar节点
- 保留Fragment中的
setHasOptionsMenu(true)配置,重写onCreateOptionsMenu方法将自定义菜单加载到全局Toolbar上,原有的onOptionsItemSelected方法可直接复用处理点击事件
避坑提醒:不要同时启用「Fragment独立Toolbar手动加载菜单」和「Fragment开启全局菜单分发」两套逻辑,只要两套逻辑同时存在,且Activity未禁用系统ActionBar,必然会出现双操作栏的问题。
内容的提问来源于stack exchange,提问作者TavianT
相关产品推荐
相关产品推荐

