Замена фрагмента в неправильном порядке, когда не используется addToBackStack - PullRequest
0 голосов
/ 28 февраля 2020

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

Когда пользователь нажимает кнопку1, происходит следующее:

setFragment(R.id.bottom_bar_container, new FooBottomBar());

Когда он нажимает кнопку2, это вызовет:

setFragment(R.id.bottom_bar_container, new BarBottomBar());

Вот метод setFragment:

private void setFragment(int layout, Fragment newFragment) {
    String tag = newFragment.getClass().getCanonicalName();

    Fragment fragment = getFragmentManager().findFragmentByTag(tag);

    if (fragment == null) {
        fragment = newFragment;
    }

    Log.d("Tag", "Replacing with " + tag);

    getFragmentManager()
            .beginTransaction()
            .replace(layout, fragment, tag)
            .commit();
}

В целом это работает хорошо, но если пользовательский спам нажимает обе кнопки, может произойти что-то интересное.

Logcat :

Tag: Replacing with com.example.FooBottomBar
Tag: Replacing with com.example.BarBottomBar

Но в пользовательском интерфейсе я вижу FooBottomBar, хотя последняя замена была BarBottomBar.

Я обнаружил, что если я добавлю addToBackStack(null), проблема исчезнет, ​​но Я не хочу иметь это на заднем стеке.

getFragmentManager()
        .beginTransaction()
        .replace(layout, fragment, tag)
        .addToBackStack(null)
        .commit();

Я хотел бы знать причину этой проблемы и есть ли какое-либо решение этой проблемы.

1 Ответ

0 голосов
/ 28 февраля 2020

Используйте getChildFragmentManager() с commitNow() вместо.

getChildFragmentManager()
        .beginTransaction()
        .replace(layout, fragment, tag)
        .commitNow();
...