Android удаляет транзакцию из заднего стека - PullRequest
0 голосов
/ 16 октября 2018

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

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

, когда я нажимаю кнопку «назад», вот что будет

A <- B <- C <- <strong>B <-<strong> C

и что я хочу, это

A <- <strong>B <- <strong>C

это означает, что если добавить уже добавленный фрагмент, старый необходимо удалить, точнее удалить транзакцию из заднего стека

, этот код не будет работать, потому что мы добавляем новую транзакцию:

FragmentTransaction transaction = mContext.beginTransaction();
Fragment lastFragment = mContext.findFragmentByTag(mFragmentTag);
if (lastFragment != null) {
     transaction.remove(lastFragment);
     transaction.commit();
}

Кстати, некоторые разработчики могут ошибиться, но в стеке назад хранятся транзакции, а НЕ фрагменты.

1 Ответ

0 голосов
/ 16 октября 2018

Чтобы получить такое поведение, вы можете выполнить что-то вроде этого:

Я предполагаю, что у вас есть 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();
}
* 1006Во-первых, вам нужно иметь теги для всего вашего фрагмента.Основная идея - это popBackStack до выбранного фрагмента тега.

И из документации popBackStack(String name, int flags)

Извлечь последний переход фрагмента из заднего стека фрагмента менеджера.Если всплыть нечего, возвращается false.Эта функция асинхронна - она ​​ставит запрос на выдвижение, но действие не будет выполнено до тех пор, пока приложение не вернется в свой цикл обработки событий.

@ param name Если не ноль, это имя предыдущегозаднее состояние для поиска;если найдено, все состояния до этого состояния будут вытолкнуты.

Флаг {@link #POP_BACK_STACK_INCLUSIVE} может использоваться для контроля того, что само именованное состояние выталкивается.Если ноль, только верхнее состояние выталкивается.@param flags Либо 0, либо {@link #POP_BACK_STACK_INCLUSIVE}.

...