添加Options Menu后Hamburger Icon无法打开DrawerLayout,如何解决?
问题根源
你在Fragment的MenuProvider里,onMenuItemSelected方法始终返回true,这会拦截所有菜单项的点击事件——包括汉堡图标对应的android.R.id.home。原本这个事件应该由AppBarConfiguration处理来打开抽屉,现在被你的Fragment拦截了,所以点击汉堡图标没反应,但滑动抽屉的逻辑不受影响。
修复方案
修改onMenuItemSelected方法,只在处理你自定义的菜单项时返回true,其他情况返回false,让系统继续处理汉堡图标的点击:
private val menuProvider = object : MenuProvider { override fun onCreateMenu(menu: Menu, menuInflater: MenuInflater) { menuInflater.inflate(R.menu.menu, menu) } override fun onMenuItemSelected(menuItem: MenuItem): Boolean { return when (menuItem.itemId) { R.id.flashlight -> { val iconId = toggleFlashLight() menuItem.icon = ContextCompat.getDrawable(requireContext(), iconId) true // 仅处理自己的菜单项时返回true } else -> false // 其他事件交给系统处理,包括汉堡图标 } } }
额外优化
可以用addMenuProvider的重载方法绑定Fragment的生命周期,不用手动在onPause里移除:
override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) // 绑定到Fragment的生命周期,自动管理MenuProvider的添加和移除 requireActivity().addMenuProvider(menuProvider, viewLifecycleOwner, Lifecycle.State.STARTED) }
这样能避免内存泄漏,也省去手动管理的麻烦。
内容的提问来源于stack exchange,提问作者user1785730
相关产品推荐
相关产品推荐

