IllegalStateException: уже добавленный фрагмент не перехвачен с помощью try-catch - PullRequest
0 голосов
/ 11 июня 2019

Итак, у меня есть замечательная функция:

public static MenuPictureFragment newMenuPictureFragment(FragmentActivity fragmentActivity, String userIdParam, int containerId){
    MenuPictureFragment menuPictureFragment = (MenuPictureFragment) fragmentActivity.getSupportFragmentManager().findFragmentByTag(fragmentActivity.getString(R.string.fragment_tag_menu_picture_fragment));

    try {
        if(menuPictureFragment == null) {
            menuPictureFragment = MenuPictureFragment.newInstance(userIdParam);
        } 
        FragmentTransaction fragmentTransaction = fragmentActivity.getSupportFragmentManager().beginTransaction();
        fragmentTransaction.add(containerId, menuPictureFragment, fragmentActivity.getString(R.string.fragment_tag_menu_picture_fragment));
        fragmentTransaction.commit();
    } catch (RuntimeException re){
        //intentionelly empty
    }

    return menuPictureFragment;
}

menuPictureFragment - это фрагмент внутри фрагмента, если я ухожу от родительского фрагмента, в какой-то момент приложение вылетает с сообщением IllegalStateException: Fragment already added,

Разве это исключение не должно быть поймано?Добавление !menuPictureFragment.isAdded() также не помогает.

Если я заменим fragmentTransaction.add на fragmentTransaction.replace, то исключение исчезнет, ​​но menuPictureFragment присутствует только в начале, после обхода назад (когда до исключения.был брошен) фрагмент больше не показывается.

Что, черт возьми, здесь происходит?

Ответы [ 2 ]

0 голосов
/ 11 июня 2019

Решение было: вам нужно использовать getChildFragmentManager() вместо getSupportFragmentManager(), если это вложенный фрагмент / если вы добавляете фрагмент к фрагменту.

0 голосов
/ 11 июня 2019

Фактическая проблема, скорее всего, такова:

этот тег R.string.fragment_tag_menu_picture_fragment, возможно, не был применен - ​​

и поэтому он всегда будет возвращать null (что можно понимать как «фрагментный тег не найден»).

и затем он попытается добавить это MenuPictureFragment дважды -

, который выбросит этого необученного IllegalStateException. Например:

String tag = fragmentActivity.getString(R.string.fragment_tag_menu_picture_fragment);
menuPictureFragment = MenuPictureFragment.newInstance(userIdParam);
menuPictureFragment.setTag(tag);

или передайте желаемый String tag в некоторый метод .newInstance(String userId, String tag) и позвольте Fragment установить свой собственный тег.

...