Управляйте потоком обратного стека фрагментов без щелчков

  1. Я создал открытый фрагмент AppCompatActivity A->B->C->D->E->F с помощью replace()
  2. Я нахожусь на F, которая содержит кнопку, когда я нажимаю кнопку, я хочу очистить фрагменты до C и хочу открыть G поверх C, поэтому новая последовательность будет A-> B-> C-> GI может сделать это с помощью popBackStackImmediate ( ) и добавьте G поверх C с помощью функции замены.

Проблема: когда я нажимаю кнопку, я вижу C на доли секунды, а затем на ней отображается G. Чтобы предотвратить это, я попытался остановить анимацию с помощью answer, но C все еще виден в течение доли секунд, даже когда анимация останавливается для фрагментов.

Есть ли лучший способ спроектировать поток фрагментов или способ решить эту проблему при замене фрагмента поверх C?


person Kirtan    schedule 22.02.2018    source источник
comment
В последнее время я сам пытаюсь понять это. Отключение анимации, как я понимаю, отключит только анимацию транзакций, но не сами транзакции.   -  person kazume    schedule 22.02.2018
comment
Я думаю, что сначала замена фрагмента, а затем очистка обратного стека поможет!!   -  person Rushabh Shah    schedule 26.02.2018
comment
эй, вы пробовали ответ ниже или все еще сталкиваетесь с проблемой?   -  person 44kksharma    schedule 02.03.2018
comment
просто мое мнение: A, B, C в первом действии, затем D, E, F, G в втором действии, когда вы достигнете C, вы можете использовать popBackStackImmediate(), если все еще нужно C или закончить первое действие после начала второго действия.   -  person Iqbal Rizky    schedule 03.03.2018


Ответы (2)


Мне был так любопытен этот вопрос, что я создал пример проекта и реализовал тот же вариант использования, который вы упомянули в своем вопросе. Вот как я справился с этим.

Использовал этот метод для удаления фрагментов F, E, D из стопки.

private void removeFragments() {
    getSupportFragmentManager().popBackStack("F", FragmentManager.POP_BACK_STACK_INCLUSIVE);
    getSupportFragmentManager().popBackStack("E", FragmentManager.POP_BACK_STACK_INCLUSIVE);
    getSupportFragmentManager().popBackStack("D", FragmentManager.POP_BACK_STACK_INCLUSIVE);
}

Использовал этот метод для замены фрагмента

private void replaceNewFragment(String key) {
    getSupportFragmentManager().beginTransaction().addToBackStack(key)
            .replace(android.R.id.content, AFragment.newInstance(key)).commit();
}

Вот демонстрационное видео. введите описание изображения здесь

Вот завершение этого проекта на github.

person Zeeshan Shabbir    schedule 04.03.2018

Более универсальное решение для такого потока навигации, замените такой фрагмент

getSupportFragmentManager().beginTransaction().
                  replace(R.id.f_container,new FragmentA())
                    .addToBackStack("A")
                    .commit();
getSupportFragmentManager().beginTransaction().
                  replace(R.id.f_container,new FragmentB())
                    .addToBackStack("B")
                    .commit();

аналогично, делайте это до фрагмента F и давайте предположим, что теперь у вас есть кнопка отправки на F внутри onClick кнопки отправки

Вставьте стек обратно до D с флагом POP_BACK_STACK_INCLUSIVE, как показано ниже, и добавьте контейнер замены с фрагментом G

getActivity().getSupportFragmentManager().popBackStack("D",
FragmentManager.POP_BACK_STACK_INCLUSIVE);
getSupportFragmentManager().beginTransaction().
                      replace(R.id.f_container,new FragmentG())
                        .addToBackStack("G")
                        .commit();

Теперь, когда вы нажмете кнопку «Назад», вы увидите фрагмент C.

Я надеюсь, что это поможет вам, это работает для меня

person 44kksharma    schedule 01.03.2018
comment
Это работает для меня. Хитрость заключается в том, чтобы использовать popBackStack(), а не popBackStackImmediate(), и объединить все в один коммит, как предлагает 44kksharma. - person kazume; 03.03.2018
comment
Да, хитрость заключается в том, что popBackStack вместо popBackStackImmediate, но дело в том, что когда мы используем popBackStack, он воспроизводит анимацию, которая выглядит странно, если мы установили анимацию слайда как всплывающую анимацию фрагмента C при отображении фрагмента G. - person Kirtan; 05.03.2018