Удаление фрагмента из заднего стека - PullRequest
56 голосов
/ 27 января 2012

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

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

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

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

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

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

Обновить

Я, вероятно, должен добавить, что фрагмент, с которым у меня проблемы, является 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();

Ответы [ 3 ]

154 голосов
/ 25 октября 2012

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

FragmentManager manager = getActivity().getSupportFragmentManager();
FragmentTransaction trans = manager.beginTransaction();
trans.remove(myFrag);
trans.commit();
manager.popBackStack();
13 голосов
/ 14 января 2016

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

т.е.У меня есть 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();
    }
}
0 голосов
/ 17 октября 2013

Что произойдет, если фрагмент, который вы хотите удалить, находится не поверх стека?

Тогда вы можете использовать эти функции

<a href="http://developer.android.com/reference/android/app/FragmentManager.html" rel="nofollow">popBackStack(int arg0, int arg1);</a>

<a href="http://developer.android.com/reference/android/app/FragmentManager.html" rel="nofollow">popBackStack(String arg0, int arg1);</a>

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...