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}.