我有一个bottomnavigationview,它使用 setupWithNavController()与导航组件链接。它可以按您期望的那样工作,按菜单项会将我移至所需的窗口。
问题是,在重定向到另一个屏幕之前,我需要检查用户是否已登录,并根据该用户是否需要重定向到另一个屏幕。
到目前为止,看来我可以在我的bottomnavigation视图上使用 setOnNavigationItemSelectedListener(),但是随后我放弃了 setupWithNavController()的所有便利,因此必须手动指定我想去的所有目的地。
有没有更好的方法来实现这一目标?
编辑:我的登录屏幕实际上是透明的,因此,转到所需的片段然后在顶部显示登录屏幕可能很棘手
答案 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)
}
}