Удаление фрагмента из заднего стека
У меня есть 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();
Ответы
Ответ 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();
}
}
Ответ 3
Что произойдет, если фрагмент, который вы хотите удалить, находится не поверх стека?
Затем вы можете использовать функции тезисов
popBackStack(int arg0, int arg1);
popBackStack(String arg0, int arg1);