Я использую библиотеку совместимости с Android для реализации фрагментов и расширил образец макета так, чтобы фрагмент содержал кнопку, запускающую другой фрагмент.
В панели выбора слева у меня есть 5 выбираемых элементов - A B C D E
.
Каждый загружает фрагмент (переходное отверстие FragmentTransaction:replace
) в панели сведений -a b c d e
Теперь я расширил фрагмент, e
чтобы он содержал кнопку, которая загружает другой фрагмент e1
также в области сведений. Я сделал это e
для метода onClick фрагмента следующим образом:
FragmentTransaction ft = getActivity().getSupportFragmentManager().beginTransaction();
ft.replace(R.id.details_frag, newFrag);
ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN);
ft.addToBackStack(null);
ft.commit();
Если я сделаю следующие выборы:
E - e - e1 - D - E
Затем фрагмент e
находится в панели деталей. Это нормально, и я хочу. Однако, если я нажму back
кнопку в этот момент, ничего не произойдет. Мне нужно дважды щелкнуть по нему, потому что e1
он все еще находится в стеке. Кроме того, после щелчка я получил исключение нулевого указателя в onCreateView:
Чтобы «решить» эту проблему, я добавил следующее, когда A B C D E
выбрано:
FragmentManager fm = getActivity().getSupportFragmentManager();
for(int i = 0; i < fm.getBackStackEntryCount(); ++i) {
fm.popBackStack();
}
Просто интересно, правильное ли это решение или мне нужно сделать что-то другое?
Другое чистое решение, если вы не хотите выталкивать все записи стека ...
Это сначала очистит стек, а затем загрузит новый фрагмент, поэтому в любой момент у вас будет только один фрагмент в стеке.
источник
getSupportFragmentManager().popBackStack(null, FragmentManager.POP_BACK_STACK_INCLUSIVE);
перед тем, как заменить () , так как загружаются призвание FragmentonCreateView()
,onActivityCreated()
и т.д. Восстановление и Destroing фрагмент мгновенно плохо. Например, фрагмент может зарегистрировать получателя. Это влияет на производительность.FragmentTransaction
? Есть только плохая производительность неправильного стека фрагментов?Благодаря ответу Иоахима я использую код, чтобы окончательно очистить все записи в обратном стеке.
источник
popBackStack(backStackId, INCLUSIVE)
вернет все фрагменты (состояния) обратно в backStackId, поэтому, как только вы выберете самый низкий,i
который вы собираетесь вытолкнуть , все более высокие должны появиться одновременно. Так в чем смысл цикла?Я много исследовал, как очистить Backstack, и, наконец, увидел Transaction BackStack и его управление . Вот решение, которое лучше всего сработало для меня.
Вышеупомянутый метод перебирает все транзакции в стеке и сразу удаляет их по одной.
Примечание. Приведенный выше код иногда не работает, и я сталкиваюсь с ANR из-за этого кода, поэтому, пожалуйста, не пытайтесь это сделать.
Обновите метод ниже, чтобы удалить все фрагменты этого «имени» из стека.
источник
Я использую код, аналогичный тем, которые используют цикл while, но я вызываю счетчик записей в каждом цикле ... поэтому я полагаю, что он несколько медленнее
источник
Как написано в разделе Как извлечь фрагмент из бэкстэка и здесь Ларшем , мы можем вставить несколько фрагментов сверху вниз в конкретный тег ( вместе с тегированным фрагментом ), используя этот метод:
Замените "фрагмент" тегом вашего фрагмента. Помните, что сначала мы должны добавить фрагмент в стопку с помощью:
Если мы добавим фрагменты с помощью
addToBackStack(null)
, мы не получим фрагменты таким образом.источник
источник