You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

重写onNavigationItemSelected导致DrawerLayout点击项无法导航至Fragment

Android Navigation Component导航失效问题解决

问题根源

调用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.04 05:20:49