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

Удалите один конкретный фрагмент из 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] на экране?

4b9b3361

Ответ 1

Вы можете просто сделать свой собственный задний стек и переопределить onBackPressed() и обрабатывать его любым способом, который, по вашему мнению, подходит. Я не думаю, что есть другой способ добиться желаемого поведения.

Ваш собственный задний стек может быть просто тегами ArrayList для ваших фрагментов.

Ответ 2

Я просто ответил на аналогичный вопрос, поэтому вот ссылка на этот ответ.

Реализация позволяет удалить Fragment из любого места в backstack, и это достигается за счет использования refrection для изменения внутренних переменных, которые хранят информацию backstack в FragmentManagerImpl и BackStackRecord.

Хотя я не рекомендую использовать его, я надеюсь, что это поможет.

Ответ 3

Это решение работает только для вашего дела. Вам не нужно класть Fragment2 в backstack. Что вы можете сделать, это удалить код "ft.addToBackStack(" Fragment2 ");". Фрагмент2 не находится в стеке. Таким образом, вы закрываете фрагмент2 и оставляете [фрагмент 3] на экране.

Ответ 4

Вы можете создать свой собственный менеджер/наблюдатель фрагментов. Это будет просто простой список или карта внутри. Отслеживайте их с помощью тега или просто имени класса (getClass). Таким образом, вы сможете избежать создания нового кеша и повторного использования кеширования, тем самым контролируя потребление памяти. Вы также сможете манипулировать фрагментами так, как вы хотите (переопределите onBackPressed и нажмите, какой фрагмент вам нравится), вместо того, чтобы использовать только то, как Google говорит, что это должно/может быть сделано.