Как заменить верхний фрагмент? - PullRequest
0 голосов
/ 16 января 2019

У меня есть приложение с 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?

Ответы [ 2 ]

0 голосов
/ 16 января 2019

https://developer.android.com/reference/android/app/FragmentManager.html#isStateSaved()

Используйте isStateSaved, чтобы избежать потери состояния при совершении транзакции.

И я думаю, компонент навигации Android может быть более простым способом навигации между фрагментами.

0 голосов
/ 16 января 2019

Попробуйте это:

    FragmentManager fm = getFragmentManager();
    FragmentTransaction ft = fm.beginTransaction();
    ft.replace(R.id.FragmentToBeReplaced,theFragmentToBeAdded);
    ft.commit();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...