当前位置: 首页 > 知识库问答 >
问题:

带导航组件的抽屉布局-仅在一个项目上侦听器

冷正信
2023-03-14

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

我使用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仅对一个菜单项执行操作。

我希望它足够清楚。如果你需要精确性,不要犹豫。

非常感谢。

共有1个答案

傅树
2023-03-14

好的,我想出来了,这就是框架对你的要求:

NavigationUI. onNavDestinationSelec(est, 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
        }

 类似资料:
  • 问题内容: 我有一个导航图,该导航图将此片段用作主活动XML中的主页。 我有一个带有菜单的Drawer布局,单击导航抽屉按钮时,我无法设法使导航正常工作(它可以从主要片段工作,但是当我单击Drawer按钮时,不能工作),如果我使用的是旧方法使用:对导航抽屉编程,我的navcontroller丢失了!!我得到类似的错误 navcontroller无法识别目标片段,因为即使不是这种情况,控制器也会看到

  • 我有一个导航图,它在主活动XML中使用这个片段作为主页。 我有一个带菜单的抽屉布局,当我点击抽屉菜单按钮时,我无法使导航工作(它从主片段工作,但当我点击抽屉按钮时就不工作),如果我使用旧的方式来编程抽屉菜单:

  • 如何禁用DrawerLayout的手势识别?(从左向右滑动)并仅接受关闭手势(从右向左)并仅使用home按钮打开抽屉?

  • 实际上,我正在我的应用程序中使用新的架构组件,并且我已经设置了导航组件。我有一个导航抽屉,我想用它。我已经设置好了,但我面临一些问题: 1-抽屉不会自动关闭。菜单正常工作并导航到正确的位置,但导航后不会关闭。我必须添加一个目的地ChangedListener才能自己关闭它。 在代码实验室里,抽屉自动关闭,我真的不明白为什么。 2-向上按钮打开抽屉。当我导航到非顶级片段时,菜单图标变为向上箭头,但当

  • 有什么方法可以确保抽屉菜单保持在片段内容的顶部吗? 我用虚拟数据创建了一个小测试应用程序。10个片段,带有相应的编号按钮和文本视图。问题在于片段元素似乎比导航抽屉具有更高的优先级。 如屏幕截图所示,一旦我试图打开“0片段”,它就会选择注册点击导航抽屉后面的按钮。按下任何其他内容项都可以,但只要它们下面没有其他可交互的项。我该怎么做才能让导航抽屉正确地位于其后面内容的顶部?

  • 抽屉打开正常并正确显示,但当我单击列表中的项目时什么都没有发生。这是我从谷歌教程(UDACITY)中获取的代码。 我希望它能帮助你。 我做的一切都和教程视频完全一样。