Как избежать навигации по Android IllegalArgumentException в NavController - PullRequest
0 голосов
/ 14 февраля 2019

Я недавно переключился на Android Navigation, но столкнулся с довольно большим количеством ситуаций (в разных частях кода), где я получаю:

Fatal Exception: java.lang.IllegalArgumentException
navigation destination com.xxx.yyy:id/action_aFragment_to_bFragment is unknown to this NavController

В любом случае код - это простые вызовыкак:

findNavController(this, R.id.navigation_host_fragment).navigate(R.id.action_aFragment_to_bFragment)

Обычно в ответ на нажатие кнопки.

Непонятно, почему эта ошибка возникает.В настоящее время я подозреваю, что onClickListener как-то вызывается дважды на некоторых устройствах, в результате чего навигация вызывается во второй раз (что приводит к тому, что она в то время находилась в неправильном состоянии).Причина такого подозрения заключается в том, что чаще всего это происходит в тех случаях, когда перед вызовом навигации можно выполнить «длительную» операцию.Однако я не могу воссоздать это на своем собственном устройстве.

Идеи о том, как избежать этой проблемы (или, собственно, какова истинная причина проблемы)?

Я не знаюне хочу использовать глобальные действия;Я опасаюсь вводить еще более неожиданные состояния в backstack.И я действительно предпочел бы не испытывать текущее состояние каждый раз, когда выполняется навигационный вызов.

Ответы [ 2 ]

0 голосов
/ 16 мая 2019

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

 if (findNavController().currentDestination?.id == R.id.currentFragment) {
    findNavController().navigate(R.id.action_current_next)}
0 голосов
/ 14 февраля 2019

Хорошо, позвольте мне объяснить вам, что это исключение прошло, потому что мы вызываем действие из фрагмента (адресата), который не является текущим адресатом в стеке.

т.е. вы вызываете действие

R.id.action_aFragment_to_bFragment

из фрагмента A, но в navController текущее назначение отличается от фрагмента A.Вот почему navController через это исключение:

navigation destination com.xxx.yyy:id/action_aFragment_to_bFragment is unknown to this NavController

вы можете проверить текущий пункт назначения перед навигацией.как

 Toast.makeText(context,view?.findNavController()?.currentDestination?.label,Toast.LENGTH_SHORT).show()

Это покажет вам текущий пункт назначения, и я уверен, что это будет другой пункт назначения.

Это произойдет, когда мы заменим фрагмент, отличный от действий (например, через старыйметоды без навигации) или мы выскакиваем этот фрагмент перед вызовом действия.

Если это так, то вам нужно использовать Глобальное действие , потому что им все равно, какой текущий пункт назначения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...