Запретить переход к одному фрагменту - PullRequest
0 голосов
/ 03 октября 2019

Я использую навигационную библиотеку Jetpack для Android с BottomNavigationView. Я реализовал NavHost, NavGraph и мои фрагменты. Все работает так, как задумано, когда я использую действия для навигации.

Я использую следующий код для настройки всего:

 val navController = Navigation.findNavController(this, R.id.nav_host)
 bottom_navigation.setupWithNavController(navController)

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

Ответы [ 2 ]

3 голосов
/ 03 октября 2019

По этой проблеме ,

Не стесняйтесь устанавливать OnNavigationItemReselectedListener , который имеет приоритет над OnNavigationItemSelectedListener, установленным NavigationUI.

val navController = Navigation.findNavController(this, R.id.nav_host)
bottom_navigation.setupWithNavController(navController)
bottom_navigation.setOnNavigationItemReselectedListener {
  // Do nothing to ignore the reselection
}
0 голосов
/ 27 октября 2019

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

fun NavigationView.setupWithUniqueFragment(navController: NavController) {

    this.setNavigationItemSelectedListener(object : NavigationView.OnNavigationItemSelectedListener {
        override fun onNavigationItemSelected(item: MenuItem): Boolean {
            val parent = this@setupWithUniqueFragment.parent
            if (item.itemId == navController.currentDestination?.id) {
                if (parent is DrawerLayout) {
                    parent.closeDrawer(this@setupWithUniqueFragment, true)
                }
                return true
            }
            val handled = NavigationUI.onNavDestinationSelected(item, navController)
            if (handled) {
                if (parent is DrawerLayout) {
                    parent.closeDrawer(this@setupWithUniqueFragment, true)
                }
            }
            return handled
        }

    })

    val weakReference = WeakReference<NavigationView>(this@setupWithUniqueFragment)
    navController.addOnDestinationChangedListener(
        object : NavController.OnDestinationChangedListener {
            override fun onDestinationChanged(
                controller: NavController,
                destination: NavDestination, arguments: Bundle?
            ) {
                val view = weakReference.get()
                if (view == null) {
                    navController.removeOnDestinationChangedListener(this)
                    return
                }
                val menu = view.menu
                var h = 0
                val size = menu.size()
                while (h < size) {
                    val item = menu.getItem(h)
                    item.isChecked = matchDestination(destination, item.itemId)
                    h++
                }
            }
        })
}

internal fun matchDestination(
    destination: NavDestination,
    @IdRes destId: Int
): Boolean {
    var currentDestination: NavDestination? = destination
    while (currentDestination!!.id != destId && currentDestination.parent != null) {
        currentDestination = currentDestination.parent
    }
    return currentDestination.id == destId
}
...