安卓导航组件底部导航视图拦截点击



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

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

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

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

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

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

问题是,在重定向到其他屏幕之前,我需要 检查用户是否已登录,并在此基础上,我会 需要重定向到其他屏幕。

在这种情况下,您可以使用如下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 函数之前看到该函数。

最新更新