Android удаляет транзакцию из заднего стека

У меня есть 3 фрагмента, и я перемещаюсь по нижнему меню (3 элемента), допустим, я перемещаюсь следующим образом:

A -> B -> C -> B -> C

когда я нажму кнопку назад, вот что произойдет

A ‹- B ‹- C ‹- B ‹- C

и я хочу это

А ‹- 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} можно использовать для управления извлечением именованного состояния. Если null, выталкивается только верхнее состояние. Флаги @param Либо 0, либо {@link #POP_BACK_STACK_INCLUSIVE}.

person Ayush Khare    schedule 16.10.2018
comment
спасибо за ответ, если у меня есть этот случай: A -> B -> C -> B, если я нажму кнопку «Назад», я хочу это: A ‹- C ‹- B; с предложенным вами решением я получу это: A ‹- B. обычно у меня больше фрагментов внутри каждой вкладки (детали, настройки ..) Я просто упростил пример. Вы можете проверить навигацию в Instagram, чтобы понять, что я ищу. - person Abdel; 16.10.2018