Android удаляет транзакцию из заднего стека
У меня есть 3 фрагмента, и я перемещаюсь, используя нижнее меню (3 пункта), допустим, я перемещаюсь следующим образом:
A -> B -> C -> B -> C
когда я нажимаю кнопку назад, вот что произойдет
A <- B <- C <- B <- C
и что я хочу это
A <- B <- C
это означает, что если добавить уже добавленный фрагмент, старый необходимо удалить, точнее удалить транзакцию из заднего стека
этот код не будет работать, потому что мы добавляем новую транзакцию здесь:
FragmentTransaction transaction = mContext.beginTransaction();
Fragment lastFragment = mContext.findFragmentByTag(mFragmentTag);
if (lastFragment != null) {
transaction.remove(lastFragment);
transaction.commit();
}
Кстати, некоторые разработчики могут ошибаться, но задний стек хранит транзакции, а НЕ фрагменты.
1 ответ
Чтобы получить такое поведение, вы можете выполнить что-то вроде этого:
Я предполагаю, что у вас есть onTabSelected(int position)
который вызывается каждый раз, когда вы нажимаете на нижнее меню.
public void onTabSelected(int position, boolean wasSelected) {
FragmentManager fragmentManager = getSupportFragmentManager();
// Pop off everything up to and including the current tab
fragmentManager.popBackStack(SELECTED_FRAG_TAG, FragmentManager.POP_BACK_STACK_INCLUSIVE);
// Add again the new tab fragment
fragmentManager.beginTransaction()
.replace(R.id.container, TabFragment.newInstance(),
String.valueOf(position)).addToBackStack(SELECTED_FRAG_TAG)).commit();
}
Во-первых, вам нужно иметь теги для всего вашего фрагмента. Основная идея popBackStack
до того фрагмента тега, который выбран.
И из документации popBackStack(String name, int flags)
Получите последний переход фрагмента из стека назад менеджера. Если нечего выдавать, возвращается false. Эта функция является асинхронной - она ставит запрос на выдвижение, но действие не будет выполнено, пока приложение не вернется в свой цикл обработки событий.
@param name Если не ноль, это имя предыдущего обратного состояния для поиска; если найдено, все состояния до этого состояния будут вытолкнуты.
Флаг {@link #POP_BACK_STACK_INCLUSIVE} может использоваться для управления тем, не вышло ли само именованное состояние. Если ноль, только верхнее состояние выталкивается. @param flags Либо 0, либо {@link #POP_BACK_STACK_INCLUSIVE}.