Android导航组件bottomnavigationview拦截点击

时间:2019-08-23 04:58:49

标签: android android-architecture-navigation

我有一个bottomnavigationview,它使用 setupWithNavController()与导航组件链接。它可以按您期望的那样工作,按菜单项会将我移至所需的窗口。

问题是,在重定向到另一个屏幕之前,我需要检查用户是否已登录,并根据该用户是否需要重定向到另一个屏幕。

到目前为止,看来我可以在我的bottomnavigation视图上使用 setOnNavigationItemSelectedListener(),但是随后我放弃了 setupWithNavController()的所有便利,因此必须手动指定我想去的所有目的地。

有没有更好的方法来实现这一目标?

编辑:我的登录屏幕实际上是透明的,因此,转到所需的片段然后在顶部显示登录屏幕可能很棘手

2 个答案:

答案 0 :(得分:0)

  

问题是,在重定向到其他屏幕之前,我需要   检查用户是否登录,并根据该用户登录   需要重定向到其他屏幕。

在这种情况下,您可以像这样使用OnDestinationChangedListener

navController.addOnDestinationChangedListener { controller, destination, arguments ->

            if(destination.id == R.id.nav_profile && !isLoggedIn()){
                //Immediately pop the fragment
                controller.popBackStack()
                //Navigate to the login fragment
                controller.navigate(R.id.nav_login)
            }

        }

在这里,所需的片段从后堆栈中删除。因此,您不必担心登录屏幕的透明背景。另外,您不会失去setupWithNavController()

的任何便利

但是,您应该确保方法isLoggedIn()足够快。否则,用户可能会在将需求函数从后堆栈中删除之前看到它们。

答案 1 :(得分:0)

bottomNav.setOnNavigationItemSelectedListener {
            if (//not login) {
                //to login fragment
                false
            } else {
                NavigationUI.onNavDestinationSelected(it, homeController)
            }
        }