Drawer Menu被Fragment Menu遮挡,点击汉堡图标无响应求助
问题原因
当Fragment通过MenuHost.addMenuProvider添加自定义菜单后,Fragment的菜单逻辑会优先于Activity处理点击事件。点击汉堡图标(android.R.id.home)时,若Fragment的MenuProvider未正确处理该事件并默认消费了它,会导致Activity的DrawerToggle无法接收到点击信号,进而无法触发Drawer Menu。
解决方案
在Fragment实现的MenuProvider中,重写onMenuItemSelected方法,明确不对android.R.id.home事件进行消费,让事件传递给Activity的DrawerToggle处理。
修改后的完整代码
// 添加Menu Provider的代码 val menuHost: MenuHost = requireActivity() menuHost.addMenuProvider( object : MenuProvider { override fun onCreateMenu(menu: Menu, menuInflater: MenuInflater) { // 加载自定义菜单 menuInflater.inflate(R.menu.main_menu, menu) val myActionMenuItem = menu.findItem(R.id.btn_search_menu) val searchView = myActionMenuItem.actionView as SearchView? searchView?.setOnQueryTextListener(object : SearchView.OnQueryTextListener { override fun onQueryTextSubmit(query: String?): Boolean { context?.getSystemService(Context.INPUT_METHOD_SERVICE)?.let { imm -> imm.hideSoftInputFromWindow(view?.windowToken, 0) } return true } override fun onQueryTextChange(newText: String?): Boolean = false }) } override fun onMenuItemSelected(menuItem: MenuItem): Boolean { return when (menuItem.itemId) { R.id.btn_search_menu -> { // 处理自定义菜单的点击逻辑(如果需要) true } android.R.id.home -> { // 不消费home按钮事件,让Activity处理Drawer的打开/关闭 false } else -> false } } }, viewLifecycleOwner, Lifecycle.State.RESUMED )
关键说明
- 在
onMenuItemSelected中,针对android.R.id.home返回false,表示该事件未被Fragment处理,会继续传递给Activity的DrawerToggle,从而恢复Drawer Menu的触发功能。 - 若你的Fragment原本是直接实现
MenuProvider接口,只需补充重写onMenuItemSelected方法即可,无需修改addMenuProvider的调用方式。
内容的提问来源于stack exchange,提问作者lelestacia
相关产品推荐
相关产品推荐

