У меня есть приложение с 4 фрагментами: MainFragment, ActionFragment, DoneFragment, FailedFragment. Когда приложение запущено, оно показывает MainFragment. Затем приложение получает какое-то событие и показывает ActionFragment с двумя кнопками «да» и «нет». Если пользователь нажимает «да», приложение показывает DoneFragment, в противном случае FailedFragment. Когда пользователь нажимает кнопку «Назад» в приложении ActionFragment, приложение DoneFragment или FailedFragment должно отображать MainFragment.
Важное замечание: если ActionFragment, DoneFragment или FailedFragment уже открыты и какое-то событие происходит снова, приложение должно показать фрагмент ActionFragment с новыми данными события.
Итак, мне нужно:
- если ActionFragment, DoneFragment или FailedFragment уже открыт и событие происходит, я должен заменить верхний фрагмент на ActionFragment
- В противном случае мне просто нужно добавить ActionFragment.
Я пытаюсь:
fun addOrReplaceFragment(fragment: Fragment, tag: String) {
val fragmentManager = supportFragmentManager
val fragmentTransaction = fragmentManager.beginTransaction()
val previous = fragmentManager.findFragmentByTag(tag)
if (previous == null) {
fragmentTransaction.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN)
fragmentTransaction.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_CLOSE)
fragmentTransaction.add(R.id.main_fragment_container, fragment, tag)
fragmentTransaction.addToBackStack(tag)
} else {
fragmentManager.popBackStack(previous.id, 0)
fragmentTransaction.remove(previous)
fragmentTransaction.add(R.id.main_fragment_container, fragment, tag)
fragmentTransaction.addToBackStack(tag)
}
fragmentTransaction.commitAllowingStateLoss()
}
// ...
addOrReplaceFragment(ActionFragment(), "singleTag")
// ...
addOrReplaceFragment(DoneFragment(), "singleTag")
// ...
addOrReplaceFragment(FailedFragment(), "singleTag")
Здесь popBackStack () не работает. Когда ActionFragment открыт, DoneFragment или FailedFragment просто добавляют выше. И пользователь должен нажать два раза назад, чтобы вернуться в MainFragment.
Я нашел решение изменить popBackStack () на popBackStackImmediate (). Это работает хорошо, но если активность минимизирована, это вызывает сбой с IllegalStateException, потому что popBackStackImmediate () не может быть вызван после onSaveInstanceState ().
Как заменить верхний фрагмент и избежать исключения IllegalStateException?