Как добавить условия в компоненты BottomNavigationView Navigation?

#android #android-navigation #android-bottomnav

#Android #android-навигация #android-bottomnav

Вопрос:

Я пытаюсь настроить условную навигацию для своих фрагментов, используя компоненты навигации и BottomNavigationView. Текущая настройка (без условий):

 val navHostFragment = supportFragmentManager.findFragmentById(R.id.nav_host_fragment) as NavHostFragment
val navController = navHostFragment.navController
NavigationUI.setupWithNavController(bottom_navigation, navController)
  

Общая навигация работает нормально, но я хочу ограничить взаимодействие пользователя с нижней навигацией на основе условий. Если условие не выполняется во время щелчка по пункту меню, это должно привести только к отображению всплывающего окна вместо перехода к следующему фрагменту.

Я уже искал это, но упомянутое там решение предполагает сначала переход к следующему фрагменту, а затем проверку условий, но я хочу избежать этого.

Большое вам спасибо.

Ответ №1:

Выставляйте LiveData , которые будут транслироваться, которые @Ids отключены.

 class MainViewModel{

  val disableNavigation = MutableLiveData<@Ids Int>() 

   fun invalidateNavigation() {
     val canNavigate = ....
     if(!canNavigate){
        disableNavigation.value = R.id.bottom_nav_item_x
     }
   }

}
  

Тогда просто обратите внимание на это:

 mainViewModel.observe(viewLifecycleOwner){
  //disable the id here
  //re-enable the rest of the items
}
  

Комментарии:

1. Привет, Никола, спасибо за этот ввод — я думал об этом раньше, но не смог добавить «Сообщение об ошибке» для пользователя при попытке нажать на отключенный идентификатор. У вас есть какие-либо идеи о том, как это решить? Я попытался разместить NavigationItemSelectedListener для моего bottom_navigation, но это переопределяется «setupWithNavController» Большое вам спасибо

2. Вы должны отключить элемент в нижнем навигационном представлении. вы также можете отобразить сообщение об ошибке в том же блоке, потому что оно будет вызываться всем, если какой-либо пункт меню в навигационном представлении отключен.