重写onNavigationItemSelected导致DrawerLayout点击项无法导航至Fragment
问题根源
调用NavigationUI.setupWithNavController(binding.navigationView, navHostFragment.findNavController())时,系统会自动给NavigationView绑定默认的OnNavigationItemSelectedListener,负责处理菜单项到对应Fragment的跳转逻辑。但之后调用binding.navigationView.setNavigationItemSelectedListener(this)会覆盖这个默认监听器,导致原本的导航逻辑被替换,仅执行自定义的抽屉关闭代码,因此导航功能失效。
修复方案
在自定义的onNavigationItemSelected方法中,先调用NavigationUI的导航处理方法完成Fragment跳转,再执行抽屉关闭逻辑,最后返回导航处理结果以保证菜单项选中状态同步。
修改后的代码
重写的onNavigationItemSelected方法调整为:
override fun onNavigationItemSelected(item: MenuItem): Boolean { // 让NavigationUI处理导航跳转逻辑 val handled = NavigationUI.onNavDestinationSelected(item, navHostFragment.findNavController()) // 执行自定义抽屉关闭逻辑 if(binding.mainActivityRootView.isDrawerOpen(GravityCompat.END)){ binding.mainActivityRootView.closeDrawer(GravityCompat.END) } else if(binding.mainActivityRootView.isDrawerOpen(GravityCompat.START)){ binding.mainActivityRootView.closeDrawer(GravityCompat.START) } // 返回导航处理结果,确保菜单项选中状态正确更新 return handled }
关键说明
NavigationUI.onNavDestinationSelected()会自动匹配菜单项ID与导航图中的Fragment目标ID,完成跳转操作,并返回是否成功处理该导航请求。- 返回
handled而非固定true,可以保证NavigationView的选中菜单项与当前显示的Fragment同步。
内容的提问来源于stack exchange,提问作者Abed Sako
相关产品推荐
相关产品推荐

