Переход к DialogFragment создает исключение IllegalArgumentException, если кнопка нажата быстро? - PullRequest
0 голосов
/ 31 мая 2019

Мой Navigation график имеет два пункта назначения: Fragment и DialogFragment.Fragment содержит Button, который при нажатии нажимает на DialogFragment.

Все работает как положено, , за исключением , если я нажимаю кнопку очень быстро.Это может вызвать

IllegalArgumentException: назначение навигации com.example.app:id/show_dialog неизвестно этому NavController

Чтобы исправить это, я гарантирую, что текущийпункт назначения - Fragment, содержащий действие show_dialog:

val navController = findNavController()
val currentDest = navController.currentDestination?.id

if (currentDest == R.id.test_fragment) {
    navController.navigate(TestFragmentDirections.showDialog())
}

Похоже, что внесение этого изменения устранит проблему.Однако я хотел бы знать:

Почему необходимо обернуть вызов navigate условным оператором в этой ситуации?

Ответы [ 2 ]

1 голос
/ 31 мая 2019

Ваш вопрос основан только на Android внутри Архитектуры и также зависит от производительности оборудования.Просто оберните его в try/catch блок:

try{
  findNavController().navigate(TestFragmentDirections.showDialog())
}catch(e: IllegalArgumentException){
    e.printStackTrace
}
0 голосов
/ 04 июня 2019

Возможно, вы получаете IllegalArgumentException , потому что, если вы увидите метод showDialog (), вы найдете реализацию, как показано ниже:

public void show(FragmentManager manager, String tag) {
    mDismissed = false;
    mShownByMe = true;
    FragmentTransaction ft = manager.beginTransaction();
    ft.add(this, tag);
    ft.commit();
}

Я предложу написать собственный showDialogментод с реализацией ниже:

fragmentManager.beginTransaction()
               .add(dialog, "TAG")
               .commitAllowingStateLoss();
...