Странное поведение фрагментов

Я столкнулся с приложением с одним activity и всей навигацией на основе Fragment. У меня есть одно место, содержащее следующие шаги:

фрагмент1 заменен в контейнере id1; Я использую add для добавления фрагмента2 в тот же контейнер id1; после того, как я использую replace для добавления фрагмента3 в тот же контейнер id1;

Это три незащищенные транзакции. Все добавляются в задний стек. Но когда я нажимаю назад, после последнего фрагмент2 не появляется, я вижу только фрагмент1 на контейнере с идентификатором1, но фрагмент2 находится в заднем стеке, потому что следующее нажатие кнопки «Назад» не имеет эффекта. Фрагмент1 все еще виден, после следующего нажатия кнопки «Назад» фрагмент1 будет удален из контейнера.

Похоже, что после первого нажатия кнопки «Назад» фрагмент2 не создает своего вида и поэтому исчезает на контейнере.

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

FragmentTransaction transaction = fragmentManager.beginTransaction();
        transaction.replace(R.id.kp_content_frame, fragment);

    if (addToBackStack) {
        transaction.addToBackStack(fragment.getTag());
    }
    if (allowingStateLoss) {
        transaction.commitAllowingStateLoss();
    } else {
        transaction.commit();
    }

Для добавления:

final String tagToAdd = fragment instanceof BaseFragment ? ((BaseFragment) fragment).getCustomTag() : fragment.toString();

        if(isDuplicateFragment(tagToAdd)) {
            return;
        }

        FragmentTransaction transaction = fragmentManager.beginTransaction();

        if (enterPopAnim != 0 || exitPopAnim != 0) {
            transaction.setCustomAnimations(enterAnim, exitAnim, enterPopAnim, exitPopAnim);
        } else if(enterAnim != 0 || exitAnim != 0) {
            transaction.setCustomAnimations(enterAnim, exitAnim);
        }

        transaction.add(R.id.kp_content_frame, fragment, tagToAdd);

        if (addToBackStack) {
            transaction.addToBackStack(tagToAdd);
        }
        transaction.commit();

Любые идеи? Спасибо.


person busylee    schedule 06.07.2015    source источник


Ответы (1)


Но когда я нажимаю назад, после последнего фрагмент2 не появляется

Поскольку у вас есть два фрагмента в контейнере id1. И фрагмент1 выше фрагмента2.

Я вижу только фрагмент1 в контейнере с идентификатором1, но фрагмент2 находится в заднем стеке, потому что следующее нажатие кнопки «Назад» не имеет эффекта. Фрагмент1 все еще виден,

Потому что следующее нажатие кнопки «Назад» удалило фрагмент 2, который был невидим.

Простое решение: не смешивайте транзакции add и replace. Используйте replace везде.

person Alexander Suslov    schedule 07.07.2015