如何使用Navigation Controller设置Navigation Drawer并处理单个菜单项 [英] How to Have Navigation Drawer setup with Navigation Controller and handle individual Menu Items

查看:82
本文介绍了如何使用Navigation Controller设置Navigation Drawer并处理单个菜单项的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我希望大多数菜单项都由Navigation Component的控制器处理,但我也想像这样单独处理一个注销"菜单项:

val navController = findNavController(R.id.nav_host_fragment)
        nav_view.setNavigationItemSelectedListener { item ->
            when(item.itemId) {
                R.id.logout_menu_item -> {
                    Toast.makeText(context, "Logut Menu Item Touched", Toast.LENGTH_LONG).show()
                    true
                }
                else -> false
            }
        }
        nav_view.setupWithNavController(navController)
        bottom_navigation.setupWithNavController(navController)

为什么这不起作用,以及如何解决此问题?

解决方案

我目前不确定是否有适当的方法来执行此操作,但是您始终只能不使用setupWithNavController方法.

我也遇到了这个问题,并且作为测试,将对setNavigationItemSelectedListener的呼叫移到了 setupWithNavController的呼叫,并且用于注销的导航代码正在运行,但是其余的的导航不是.我的意思是,在随后的setNavigationItemSelectedListener调用中会覆盖navigationListener,而setupWithNavController在内部会调用setNavigationItemSelectedListener.

我试图在Google源代码中对此进行验证,但无法轻松找到该存储库.

我通过不调用setupWithNavController而不是做类似的事情来解决该问题:

    navigationDrawer?.setNavigationItemSelectedListener { menuItem ->
        if (menuItem.itemId == R.id.action_sign_out) {
            // sign out logic
            return@setNavigationItemSelectedListener true
        }

        val result = menuItem.onNavDestinationSelected(navigationController)
        drawerLayout?.closeDrawers()
        result
    }

I would like to have most of menu item handled by Navigation Component's controller, but I also want to handle one "Log out" menu item individually like this:

val navController = findNavController(R.id.nav_host_fragment)
        nav_view.setNavigationItemSelectedListener { item ->
            when(item.itemId) {
                R.id.logout_menu_item -> {
                    Toast.makeText(context, "Logut Menu Item Touched", Toast.LENGTH_LONG).show()
                    true
                }
                else -> false
            }
        }
        nav_view.setupWithNavController(navController)
        bottom_navigation.setupWithNavController(navController)

Why this doesn't work, and how to resolve this issue?

解决方案

I'm not sure that there is a proper way to do this at the moment, but you could always just not use the setupWithNavController method.

I ran into this as well and, as a test, moved my call to setNavigationItemSelectedListener to after the call to setupWithNavController and and my navigation code for signing out was running but the rest of the navigation was not. I take this to mean that the navigationListener is overwritten on subsequent calls to setNavigationItemSelectedListener and that setupWithNavController calls setNavigationItemSelectedListener internally.

I attempted to verify this in google source, but couldn't find the repo easily.

I worked around the problem by not calling setupWithNavController and instead doing something like:

    navigationDrawer?.setNavigationItemSelectedListener { menuItem ->
        if (menuItem.itemId == R.id.action_sign_out) {
            // sign out logic
            return@setNavigationItemSelectedListener true
        }

        val result = menuItem.onNavDestinationSelected(navigationController)
        drawerLayout?.closeDrawers()
        result
    }

这篇关于如何使用Navigation Controller设置Navigation Drawer并处理单个菜单项的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
相关文章
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆