Фрагмент не виден после popbackstack

Фрагмент (домашний фрагмент) добавляю в Activity.onCreate(), не добавляя в бэкстек, делаю это с помощью FragmentTransaction.replace(). После этого я добавляю каждый следующий фрагмент, используя FragmentTransaction.replace(), и добавляю его в стопку.

У меня есть функциональность, которая очищает задний стек, оставляя видимым домашний фрагмент, для этого я использую FragmentManager.popBackStack(null, FragmentManager.POP_BACK_STACK_INCLUSIVE);.

Если я добавляю только 1 фрагмент в задний стек, а затем очищаю задний стек, он работает нормально, но если я добавляю более одного, то после очистки заднего стека экран становится пустым, хотя домашний фрагмент получает onStart() и onResume() и думаю, что он виден , он не получает onPause(), onStop(), пока я снова не добавлю еще один фрагмент или не покину приложение. Также, если я popBackstack() один за другим (по действию пользователя), он работает нормально, но если я popBackstack() в цикле (извлекая все фрагменты сразу), это не работает.

Вот код:

public void changeFragment(BaseFragment fragment, boolean addToBackStack, boolean preventDuplicate) {
    Fragment topFragment = getSupportFragmentManager().findFragmentById(fragmentContainer.getId());
    if (preventDuplicate && topFragment != null && fragment.getClass().equals(topFragment.getClass())) {
        //Prevent adding same fragment
        return;
    }

    FragmentTransaction transaction =
            fragmentManager
                    .beginTransaction()
                    .replace(fragmentContainer.getId(), fragment);

    if (addToBackStack) {
        transaction.addToBackStack(null);
    }

    transaction.commit();
}

public void goToHome() {
    fragmentManager.popBackStack(null, FragmentManager.POP_BACK_STACK_INCLUSIVE);
}

person FullRandom    schedule 27.02.2017    source источник
comment
Попробуйте fragmentManager.popBackStackImmediate()   -  person Kamran Ahmed    schedule 27.02.2017
comment
@KamranAhmed это ничего не изменило   -  person FullRandom    schedule 27.02.2017


Ответы (2)


Существует новый метод для FragmentTransaction (добавлен в версии 25.1.0), см.: https://developer.android.com/reference/android/support/v4/app/FragmentTransaction.html#setAllowOptimization(boolean).

Попробуйте установить это в FragmentTransaction while:

final FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();    
transaction.setAllowOptimization(true);
transaction.replace(...);

Это решило проблему для меня.

Авторы: https://stackoverflow.com/a/42597413/5310016

person ox black    schedule 05.04.2017

Оказывается, новая версия библиотеки поддержки все портит. После изменения

compile 'com.android.support:appcompat-v7:25.1.1'

вернуться к

compile 'com.android.support:appcompat-v7:25.0.1'

все работает нормально

person FullRandom    schedule 27.02.2017
comment
У меня точно такая же проблема, смена версии библиотеки не помогла. Вы уверены, что ничего не меняли в своем коде? - person 4gus71n; 20.03.2017
comment
Не на 100%, но я почти уверен, что больше ничего не менял. - person FullRandom; 20.03.2017