Подтвердить что ты не робот

Удаление фрагмента из заднего стека

У меня есть 3 фрагмента в активности, когда планшет удерживается в портрете. Однако у меня только 2 из этих фрагментов, когда в ландшафте. Проблема, с которой я сталкиваюсь, - это переход от портрета к пейзажу, который создает 3-й фрагмент. Я получаю и ошибки, поскольку этот фрагмент не может быть создан.

Я выяснил, что этот фрагмент создается, потому что он находится в фоновом стеке.

Я попытался удалить фрагмент в методе onDestroy, используя

FragmentTransaction f = fragmentManager.beginTransaction();
f.remove(mf);
f.commit();

Однако я получаю сообщение об ошибке, говоря, что я не могу использовать эту функцию после onSaveInstanceState

Каким будет правильный способ вывести этот фрагмент из заднего стека?

Update

Я, наверное, должен добавить, что у фрагмента, с которым у меня возникают проблемы, есть mapFragment из этой библиотеки

https://github.com/petedoyle/android-support-v4-googlemaps

Способ, которым я его использую, похож на

mf = MapFragment.newInstance(1, true);

ft = fragmentManager.beginTransaction();
ft.replace(R.id.mapContainer, mf);
ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE);
ft.addToBackStack("map");
ft.commit();
4b9b3361

Ответ 1

Вы добавляете в состояние возврата из FragmentTransaction и удаляете из Backstack с помощью методов FragmentManager pop:

FragmentManager manager = getActivity().getSupportFragmentManager();
FragmentTransaction trans = manager.beginTransaction();
trans.remove(myFrag);
trans.commit();
manager.popBackStack();

Ответ 2

Я создал код для перехода к требуемому индексу обратного стека, он отлично работал для моей цели.

т. У меня есть Fragment1, Fragment2 и Fragment3, я хочу перейти из Fragment3 в Fragment1

Я создал метод под названием onBackPressed в Fragment3, который перескакивает на Fragment1

Fragment3:

public void onBackPressed() {
    FragmentManager fragmentManager = getFragmentManager();
    fragmentManager.popBackStack(fragmentManager.getBackStackEntryAt(fragmentManager.getBackStackEntryCount()-2).getId(), FragmentManager.POP_BACK_STACK_INCLUSIVE);
}

В этой операции мне нужно знать, является ли мой текущий фрагмент Fragment3, поэтому я вызываю onBackPressed моего фрагмента вместо вызова super

FragmentActivity:

@Override
public void onBackPressed() {
    Fragment f = getSupportFragmentManager().findFragmentById(R.id.my_fragment_container);
    if (f instanceof Fragment3)
    {
        ((Fragment3)f).onBackPressed();
    } else {
        super.onBackPressed();
    }
}