带导航组件的抽屉布局 - 只有一个项目的监听器

Drawer layout with navigation component - Listener on only one item

我遇到了有关使用导航组件实施抽屉式布局的问题。

我使用 Android Studio 的 include Navigation Drawer Activity 创建了抽屉布局。

实际上,如果菜单项的目的是更改片段或activity(如程序、歌曲、设置等...在屏幕截图中)在导航中定义,一切都很好XML

val drawerLayout: DrawerLayout = findViewById(R.id.drawer_layout)
    val navView: NavigationView = findViewById(R.id.nav_view)
    val navController = findNavController(R.id.nav_host_fragment)
    // Passing each menu ID as a set of Ids because each
    // menu should be considered as top level destinations.
    appBarConfiguration = AppBarConfiguration(
        setOf(
            R.id.nav_user_programs_list,
            R.id.nav_user_songs_list,
            R.id.nav_user_settings,
            R.id.nav_user_legal_notices,
            R.id.nav_games
        ), drawerLayout
    )
    setupActionBarWithNavController(navController, appBarConfiguration)
    navView.setupWithNavController(navController)

但是,我还想在“注销”菜单项上执行注销操作,而不启动另一个片段或 activity :

我设法做到了:

navView.setNavigationItemSelectedListener {
        if (it.itemId == R.id.nav_logout) {
            logoutUser()
        }
        true
    }

但我的问题是:使用该方法,所有其他曾经工作的项目(更改片段)不再工作,因为它调用了 NavigationItemSelectedListener,在这种情况下什么都不做。

是否有结合这两种方法的解决方案? :

我希望它足够清楚。如果您需要精度,请不要犹豫。

非常感谢。

解决方案

好的,我明白了,这就是框架为您调用的内容:

NavigationUI.onNavDestinationSelected(dest, navController)

因此您可以对所有其他情况执行相同的操作:

        navView.setNavigationItemSelectedListener {dest ->
            when(dest.itemId) {
                R.id.logout -> logout()
                else -> NavigationUI.onNavDestinationSelected(dest, navController)
            }

            true
        }

更新

以上停止“自动关闭”抽屉,所以..

        navView.setNavigationItemSelectedListener {dest ->
            when(dest.itemId) {
                else -> {
                    NavigationUI.onNavDestinationSelected(dest, navController)
                    drawerLayout.closeDrawers()
                }
            }

            true
        }