抽屉式布局与导航组件 - 只在一个项目上监听

8
我有一个与Drawer Layout和Navigation组件实现相关的问题。
我使用了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。

希望这足够清楚。 如果需要澄清,请不要犹豫。

非常感谢。

1个回答

9

解决方案

好的,我明白了,这是框架为你调用的:

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
        }


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接