带有导航组件的抽屉布局-仅一项监听器 更新

问题描述

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

我已经使用Android Studio的包含导航抽屉活动创建了抽屉布局。

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

All is fine --> Fragments are changing

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)

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

Logout dialog clicking logout menuItem --> No change of fragment

我设法做到了:

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

但是我的问题是:使用该方法,所有以前可以正常工作(更改片段)的项目都不再起作用,因为它调用了NavigationItemSelectedListener,在这种情况下不起作用。

是否有将两种方法结合使用的解决方案? :

  • 使用Android Studio认抽屉布局更改片段
  • 使用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
        }