android - 如何使用导航 Controller 设置抽屉导航并处理单个菜单项

标签 android navigation-drawer android-architecture-components android-navigation

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

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)

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

最佳答案

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

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

我试图在谷歌源代码中验证这一点,但无法轻松找到 repo 协议(protocol)。

我通过不调用 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
    }

关于android - 如何使用导航 Controller 设置抽屉导航并处理单个菜单项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51743692/

相关文章:

c# - 应用程序无法在三星 S6 中运行

android - 如何在 android 中使用 RTSP 链接直播视频?

java - 重命名不同布局中的按钮问题 Android/Java

android - 如何更改抽屉导航字体?

flutter - 没有应用栏的抽屉 Flutter

android - 房间尝试重新打开已经关闭的数据库

java - 下拉通知面板时是否可以暂停Android中的任何视频(媒体播放器)应用程序?

android - 动态添加组中的菜单项android导航菜单

android - 架构师组件中的 ViewModel - android

java - 当第一个参数是具有一个方法的类时,无法用 lambda 替换 SAM 构造函数