繁体   English   中英

android导航组件bottomnavigationview拦截点击

[英]android navigation component bottomnavigationview intercept click

我有一个底部导航视图,它使用setupWithNavController()与导航组件链接。 它按您的预期工作,按菜单项会将我移动到所需的窗口。

问题是,在重定向到不同的屏幕之前,我需要检查用户是否登录,并根据这一点,我需要重定向到不同的屏幕。

到目前为止,我似乎可以在我的底部导航视图上使用setOnNavigationItemSelectedListener() ,但随后我失去了setupWithNavController() 的所有便利,因为我必须手动指定我想去的所有目的地。

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

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

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

在这种情况下,您可以像这样使用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()足够快。 否则,用户可能会在从返回堆栈中删除之前看到 require 函数。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM