如何修复Fragment中主菜单点击卡顿、重复渲染的问题
问题根因
你遇到的菜单重复渲染+卡顿问题由以下几个常见错误导致:
- 错误重载了Fragment的
onCreateOptionsMenu方法:AndroidX中Fragment的onCreateOptionsMenu本身无返回值,你当前写的返回Boolean的方法属于错误重载,导致系统菜单分发逻辑异常,触发两次菜单加载 - 加载菜单前未清空已有条目,重复inflate导致菜单条目叠加
- 如果你是单独使用Fragment内的自定义Toolbar,走Activity的OptionsMenu分发流程会和Activity本身的菜单逻辑冲突,额外触发多次加载,条目过多就会出现点击卡顿
修复方案
方案1:继续使用系统OptionsMenu分发流程
- 修正
onCreateOptionsMenu的方法签名,加载前清空原有菜单:
override fun onCreateOptionsMenu(menu: Menu, inflater: MenuInflater) { menu.clear() inflater.inflate(R.menu.main_menu, menu) super.onCreateOptionsMenu(menu, inflater) }
- 确认仅当前Fragment调用了
setHasOptionsMenu(true),Activity和其他同栈Fragment没有重复调用该方法开启菜单分发。
方案2:自定义Toolbar独立处理菜单(更推荐,无冲突)
直接给Fragment内的Toolbar单独设置菜单,不走Activity的OptionsMenu分发流程,完全避免冲突:
- 删除
onCreate中的setHasOptionsMenu(true)代码 - 删掉原有的
onCreateOptionsMenu、onOptionsItemSelected重写方法 - 在
onViewCreated中给Toolbar单独设置菜单和点击逻辑:
override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) // 替换为你布局里自定义Toolbar的ID val customToolbar = view.findViewById<Toolbar>(R.id.custom_toolbar) // 独立加载菜单 customToolbar.inflateMenu(R.menu.main_menu) // 独立处理点击事件 customToolbar.setOnMenuItemClickListener { item -> when (item.itemId) { R.id.about -> { Log.d("MainFragment","About") true } R.id.starred -> { Log.d("MainFragment","Starred") true } else -> false } } }
内容的提问来源于stack exchange,提问作者Nakul
相关产品推荐
相关产品推荐

