Android - удалить определенный фрагмент из середины стека не работает - PullRequest
0 голосов
/ 24 сентября 2018

Я хочу реализовать динамический стек фрагментов.Более конкретно, например, предположим следующий стек:

A -> B -> C -> D

Возможно, что B будет добавлен снова после D. Если это произойдет, я хочу удалитьB так, что результат будет:

A -> C -> D -> B

Я пытался сделать это так:

void loadFragment(MyFragment f){
    FragmentManager fm = getSupportFragmentManager();
    MyFragment foundFragment = (MyFragment ) fm.findFragmentByTag(f.getClass().getName());
    if(foundFragment!=null) { 
        fm.popBackStack(f.getTransactionId(), 0);
    }
    String tag = f.getClass().getName();
    f.setTransactionId(tag);
    fm.beginTransaction()
         .addToBackStack(tag)
         .replace(R.id.fragment_container, f, tag)
         .commit();
}

, поэтому я делаю:

loadFragment(A);
loadFragment(B);
loadFragment(A);
loadFragment(B);

Затем я нанёс ответный удар, который привел меня к А (пока все в порядке)Затем я нанёс ответный удар снова, и он снова привел меня к А. (Куда ушел второй Б ???)Если я нанесу ответный удар снова, действие закроется, потому что больше нет фрагментов для всплытия.

Я не могу объяснить это ...

Как мне добиться желаемого поведения?

1 Ответ

0 голосов
/ 25 сентября 2018

Сначала вы загружаете фрагмент A.

Затем вы загружаете фрагмент B. Итак, теперь задний стек выглядит как A - B

Нет, вы пытаетесь загрузить A снова.Но уже есть фрагмент с таким же тегом.Таким образом, вы popBackStack до последнего появления A (и не включая A).Затем вы загружаете A. Таким образом, ваш задний стек теперь выглядит как A - A

Наконец, вы загружаете B. Итак, теперь, когда вы нажимаете на спину, он показывает A. И он снова показывает A, когда вы нажимаете назад.

...