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

问题描述 投票:2回答:1

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

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)

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

android android-navigation-drawer android-architecture-components android-navigation
1个回答
3
投票

我不确定目前是否有正确的方法可以做到这一点,但你总是可以不使用setupWithNavController方法。

我也遇到了这个问题,作为一个测试,在调用setNavigationItemSelectedListener之后将我的调用移到了setupWithNavController并且我的导航代码正在运行,但导航的其余部分却没有。我认为这意味着后续调用setNavigationItemSelectedListener时会覆盖navigationListener,而setupWithNavController会在内部调用setNavigationItemSelectedListener

我试图在谷歌来源验证这一点,但无法轻易找到回购。

我通过不调用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
    }
© www.soinside.com 2019 - 2024. All rights reserved.