Очистить backstack фрагмента без вызова onCreateView всплывающих фрагментов

Мое приложение имеет 3 уровня пользовательского интерфейса, каждый уровень имеет свой собственный фрагмент, A -> B -> C. Я хочу необязательно разрешить пользователю моего приложения переходить прямо к фрагменту верхнего уровня, то есть от C -> A без вызова B. т.е. я все еще хочу разрешить пользователю переходить от C-> B, если он нажимает кнопку «Назад», но во фрагменте C у меня есть кнопка «Домой», которая переводит их прямо на A. Это это операция, при которой я хочу сбросить бэкстэк. Кроме того, я хочу, чтобы пользователь мог переходить от B-> A с помощью кнопки «Назад», поэтому я добавляю A и B оба в backstack.

Я пробовал варианты из этого сообщения SO, но в каждом случае onCreateView вызывается для каждый фрагмент, даже если я использую fm_.popBackStackImmediate(null, FragmentManager.POP_BACK_STACK_INCLUSIVE);

Также проверил эту ветку, кажется, рекомендуется использовать popBackStackImmediate(null, FragmentManager.POP_BACK_STACK_INCLUSIVE)

Может ли кто-нибудь предложить способ вытолкнуть весь бэкстэк без вызова onCreateView для всплывающих фрагментов?


person user90766    schedule 16.12.2016    source источник


Ответы (3)


Не добавляйте строку backStack для перехода от фрагмента B-> C

при переходе от A-> B используйте

HighlightFragment highlightFragment=new HighlightFragment(FirstReaderScreen.this);
    getSupportFragmentManager()
    .beginTransaction()
    .add(R.id.LL_Fragment, highlightFragment) // LL_Fragment is container
    .addToBackStack(null)
    .commit();

при переходе B-> C используйте

  HighlightFragment highlightFragment=new HighlightFragment(FirstReaderScreen.this);
        getSupportFragmentManager()
        .beginTransaction()
        .add(R.id.LL_Fragment, highlightFragment)
        .commit();

не добавляйте строку .addtobackstack (null)

Это сработало для меня

person Manohar    schedule 16.12.2016
comment
Извините, мой пост не полностью документировал рабочий процесс. Я обновил его, чтобы объяснить полную навигацию. Я не могу пропустить добавление A или B из backstack. - person user90766; 16.12.2016
comment
см. stackoverflow.com/questions/7992216/ и stackoverflow.com/questions/ 5448653 /, Для обработки обратного прессования фрагментов - person Manohar; 16.12.2016
comment
Я уже обрабатываю нажатие кнопки «Назад», как объяснено выше, моя проблема заключается в навигации «Перейти на главную» с C - ›A, где я хочу сбросить backstack, не вызывая onCreateView на B. - person user90766; 16.12.2016
comment
У меня есть идея, когда вы когда-нибудь захотите открыть A напрямую, не открывая B, создайте новый фрагмент A в C и перейдите к фрагменту A и очистите все фрагменты заднего стека, иначе, если вы хотите перейти к B, просто выполните popupbackstack, может будет ли это работать - person Manohar; 16.12.2016
comment
Проблема в том, как очистить все фрагменты backstack? Если я попробую рекомендуемые подходы, упомянутые в моем исходном сообщении, каждый из них вызывает onCreateView для каждого фрагмента в backstack. Я не хочу этого. - person user90766; 16.12.2016
comment
stackoverflow.com/questions/5802141/ см. это и stackoverflow.com/questions/17107005/ это тоже - person Manohar; 16.12.2016

Я полагаю, вы используете заменяющий фрагмент. попробуйте использовать beginintransaction.hide / show для управления множеством фрагментов внутри 1 действия, если вы не хотите всплывать

//on Activity
FragmentTransaction fragmentTransaction = getSupportFragmentManager().beginTransaction();
fragmentTransaction.replace(containerId, new FragmentA(), fragmentA.getClass().getSimpleName());
fragmentTransaction.commit();
//inside fragment A to jump fragment without PopBackStack
getFragmentManager().beginTransaction().hide(this).commit();
getFragmentManager().beginTransaction().show(new FragmentB()).commit();
person Aldi Renaldi Gunawan    schedule 16.12.2016
comment
Извините, мой пост не полностью документировал навигацию, я обновил его. Единственный обходной путь, который я нашел до сих пор, - полностью пропустить A из backstack, а затем добавить код в B и C, чтобы специально заменить B / C на A, если пользователь нажимает Go to Home в B / C или нажимает android. кнопка возврата из B.Но это хитрость, я бы предпочел более чистый способ очистки backstack без вызова onCreateView на B или A. - person user90766; 16.12.2016

Это работает для меня, когда мне нужно очистить задний стек для переключателей вкладок в BottomNavigationView

public void clearBackStack() {

    int backStackEntryCount = mFragmentActivity
                                    .getSupportFragmentManager()
                                    .getBackStackEntryCount();

    for (int i = 0; i < backStackEntryCount; i++) {
        mFragmentActivity.getSupportFragmentManager().popBackStack();
    }
}
person Gene Bo    schedule 26.07.2017