Удалите один конкретный фрагмент из Android backstack
Для приложения планшета Android я использую 2 фрагмента. Один на левой стороне экрана и один на правой стороне. Когда вы нажимаете кнопку на правом фрагменте, в верхней части правого фрагмента добавляется еще один фрагмент. Этот фрагмент добавляется в заднюю часть.
FragmentTransaction ft = getFragmentManager().beginTransaction();
ft.add(R.id.fragmentlayout, fragment2);
ft.addToBackStack("Fragment2");
ft.commit();
Теперь у задней стопы:
[фрагмент 1] → [фрагмент 2]
С левой стороны также кнопка, которая открывает фрагмент поверх левого фрагмента (такой же, как и фрагмент2), и добавляет его в стопку. Теперь backstack
[фрагмент 1] → [фрагмент 2] → [фрагмент 3]
В фрагменте 2 есть кнопка для закрытия этого фрагмента.
getFragmentManager().popBackStack("Fragment2", FragmentManager.POP_BACK_STACK_INCLUSIVE);
Проблема заключается в том, что когда я хочу закрыть [фрагмент 2], [фрагмент 3] также будет уничтожен. Я могу удалить фрагмент вручную, позвонив
FragmentTransaction ft = getActivity().getSupportFragmentManager().beginTransaction();
ft.remove(fragment2).commit();
Но backstack останется
[фрагмент 1] → [(призрак) фрагмент 2] → [фрагмент 3]
Итак, вам нужно нажать еще один раз, чтобы закрыть приложение.
Есть ли способ удалить [фрагмент 2] из задней части экрана и оставить [фрагмент 3] на экране?
Ответы
Ответ 1
Вы можете просто сделать свой собственный задний стек и переопределить onBackPressed()
и обрабатывать его любым способом, который, по вашему мнению, подходит. Я не думаю, что есть другой способ добиться желаемого поведения.
Ваш собственный задний стек может быть просто тегами ArrayList
для ваших фрагментов.
Ответ 2
Я просто ответил на аналогичный вопрос, поэтому вот ссылка на этот ответ.
Реализация позволяет удалить Fragment
из любого места в backstack, и это достигается за счет использования refrection для изменения внутренних переменных, которые хранят информацию backstack в FragmentManagerImpl
и BackStackRecord
.
Хотя я не рекомендую использовать его, я надеюсь, что это поможет.
Ответ 3
Это решение работает только для вашего дела.
Вам не нужно класть Fragment2 в backstack. Что вы можете сделать, это удалить код "ft.addToBackStack(" Fragment2 ");".
Фрагмент2 не находится в стеке. Таким образом, вы закрываете фрагмент2 и оставляете [фрагмент 3] на экране.
Ответ 4
Вы можете создать свой собственный менеджер/наблюдатель фрагментов. Это будет просто простой список или карта внутри. Отслеживайте их с помощью тега или просто имени класса (getClass). Таким образом, вы сможете избежать создания нового кеша и повторного использования кеширования, тем самым контролируя потребление памяти.
Вы также сможете манипулировать фрагментами так, как вы хотите (переопределите onBackPressed и нажмите, какой фрагмент вам нравится), вместо того, чтобы использовать только то, как Google говорит, что это должно/может быть сделано.