如何在导航组件中查看片段何时更改为另一个片段



问题

我有一个BottomNavigationView,在其中我使用导航组件来显示片段。每次用户单击BottomNavigationView中的项目时,我都需要检查一个条件。使用导航组件最正确的方法是什么?

我做了什么:(有更有效的方法吗?)


val navController = findNavController(R.id.fragment)//this line I dont use it
binding.bottomNav.setupWithNavController(navController) //this line I dont use it
binding.bottomNav.apply {
setOnNavigationItemReselectedListener {
if (it.itemId == R.id.homeFragment) {
if(theUserWasLogged()){
setFragment(new HomeFragment())
}else{
displayDialogLogIn()
}
} else if (it.itemId == R.id.avisosFragment) {

setFragment(new avisosFragment())
}else{
displayDialogLogIn()
}
}
}

要使用setOnNavigationItemReselectedListener中的导航组件实现导航,您应该使用navController并直接调用导航图中定义的目的地id或操作id,在您的情况下,用navController.navigate()替换setFragment(),即

setOnNavigationItemReselectedListener {
if (it.itemId == R.id.homeFragment) {
if(theUserWasLogged()){
navController.navigate(R.id.homeFragment)
}else{
displayDialogLogIn()
}
} else if (it.itemId == R.id.avisosFragment) {
navController.navigate(R.id.avisosFragment)
}else{
displayDialogLogIn()
}
}

而且我认为可以使用when而不是if来获得更简洁的代码

setOnNavigationItemReselectedListener {
when (it.itemId) {
R.id.homeFragment -> {
if(theUserWasLogged()) {
navController.navigate(R.id.homeFragment)
} else {
displayDialogLogIn()
}
}
R.id.avisosFragment -> navController.navigate(R.id.avisosFragment)
else -> displayDialogLogIn()
}
}