Управление BackStackEntries в FragmentManager - PullRequest
5 голосов
/ 15 марта 2011

Как очистить BackStackEntries в FragmentManager? Вот код, который я использую для изменения моего фрагмента:

FragmentTransaction fragmentTransaction = getFragmentManager().beginTransaction();
Fragment homeFragment = new Home();
fragmentTransaction.replace(R.id.mainFragement, homeFragment);
fragmentTransaction.addToBackStack(null);
fragmentTransaction.commit();

В конкретной ситуации мне нужно удалить полные записи backstack. Я не нашел какой-либо конкретный метод для этого в диспетчере фрагментов. У вас есть идеи?

Ответы [ 5 ]

6 голосов
/ 10 августа 2011

Я работал над методом, который, я думаю, выполняет то, что вы просите, но единственное, что я смог выяснить из документации, это то, является ли этот метод просто пустым BackStack или есть лизначение для контейнера View.По сути, он находит запись, расположенную в верхней части стека, и удаляет все, включая эту запись.Если кто-то думает, что есть негативные последствия, дайте мне знать, потому что мне было бы очень любопытно:

public static void clearBackStack(FragmentManager manager){
    int rootFragment = manager.getBackStackEntryAt(0).getId();
    manager.popBackStack(rootFragment, FragmentManager.POP_BACK_STACK_INCLUSIVE);
}
2 голосов
/ 26 января 2012

Это прекрасно работает для меня:

clearFragments(FragmentManager fm) {
    while (fm.popBackStackImmediate());
}
1 голос
/ 17 марта 2011

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

Это большая проблема. Попробуйте загрузить проблему на Android средство отслеживания проблем , и я надеюсь, что кто-то смотрит на нее. Я все еще жду мой .

Это довольно взломанный, но вы можете попробовать закончить Activity и запустить его снова. Это может очистить стек.

1 голос
/ 17 мая 2011

Если вы хотите очистить весь задний стек, вероятно, это потому, что вы собираетесь делать что-то, что не связано с предыдущим контекстом. В этом случае вы должны запустить новую активность.

Как я начинаю понимать, с Фрагментами Действия будут работать как контейнеры Фрагментов. Вы должны попытаться сохранить независимость между Фрагментами, организуя их в Действия в соответствии с их контекстом.

В вашем случае, когда возникает конкретная ситуация, вы можете запустить новое действие и поместить нужный фрагмент в это новое действие вместо того, чтобы поместить его в старое действие. Это новое действие будет обрабатывать новый стек фрагментов. Таким образом, ваш код будет немного инкапсулирован, не так ли?

Посмотрите на этот пояснительный ответ: Ответ CommonsWare

надеюсь, это поможет!

0 голосов
/ 15 марта 2011

Вы пробовали вызовы popBackStack () в диспетчере фрагментов?

...