如何使用导航控制器设置导航抽屉并处理单个菜单项

Mic*_*bro 3 android navigation-drawer android-navigation android-architecture-components

我想让大部分菜单项由导航组件的控制器处理,但我也想单独处理一个“注销”菜单项,如下所示:

val navController = findNavController(R.id.nav_host_fragment)
        nav_view.setNavigationItemSelectedListener { item ->
            when(item.itemId) {
                R.id.logout_menu_item -> {
                    Toast.makeText(context, "Logut Menu Item Touched", Toast.LENGTH_LONG).show()
                    true
                }
                else -> false
            }
        }
        nav_view.setupWithNavController(navController)
        bottom_navigation.setupWithNavController(navController)
Run Code Online (Sandbox Code Playgroud)

为什么这不起作用,以及如何解决此问题?

小智 5

我不确定目前是否有合适的方法来执行此操作,但是您始终可以不使用该setupWithNavController方法。

我碰到了这个问题,以及和,作为一个测试,我的移动电话来setNavigationItemSelectedListener调用setupWithNavController,并和我签署了导航代码在运行,但导航的其余部分不是。我认为这意味着该navigationListener是在后续调用覆盖setNavigationItemSelectedListenersetupWithNavController通话setNavigationItemSelectedListener在内部。

我试图在 google 源代码中验证这一点,但无法轻松找到 repo。

我通过不打电话setupWithNavController而是做类似的事情来解决这个问题:

    navigationDrawer?.setNavigationItemSelectedListener { menuItem ->
        if (menuItem.itemId == R.id.action_sign_out) {
            // sign out logic
            return@setNavigationItemSelectedListener true
        }

        val result = menuItem.onNavDestinationSelected(navigationController)
        drawerLayout?.closeDrawers()
        result
    }
Run Code Online (Sandbox Code Playgroud)