【问题标题】:Drawer layout with navigation component - Listener on only one item带有导航组件的抽屉布局 - 仅监听一项
【发布时间】:2020-08-17 12:53:41
【问题描述】:

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

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

实际上,如果菜单项的目的是更改导航 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)

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

我设法做到了:

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

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

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

  • 使用 android studio 的默认抽屉布局更改片段
  • 使用 NavigationItemSelectedListener 仅对一个菜单项执行操作。

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

非常感谢。

【问题讨论】:

    标签: android android-architecture-navigation drawerlayout


    【解决方案1】:

    解决方案

    好的,我想通了,这就是框架要求你做的:

    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
            }
    
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-05-16
      • 2017-01-22
      • 2020-09-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多