Android popbackstack之后不可见片段

Android popbackstack之后不可见片段,android,android-fragments,fragmentmanager,fragment-backstack,Android,Android Fragments,Fragmentmanager,Fragment Backstack,我在Activity.onCreate()中添加片段(主片段),而不将其添加到backstack中,我使用FragmentTransaction.replace()进行添加。之后,我使用FragmentTransaction.replace()添加下一个片段,并将其添加到backstack 我有一个清除backstack的功能,使主片段可见,为此,我使用FragmentManager.popBackStack(null,FragmentManager.POP\u BACK\u STACK,包括n

我在
Activity.onCreate()
中添加片段(主片段),而不将其添加到backstack中,我使用
FragmentTransaction.replace()
进行添加。之后,我使用
FragmentTransaction.replace()
添加下一个片段,并将其添加到backstack

我有一个清除backstack的功能,使主片段可见,为此,我使用
FragmentManager.popBackStack(null,FragmentManager.POP\u BACK\u STACK,包括null)

如果我只向backback添加一个片段,然后清除backbackback,那么效果很好,但是如果我添加多个片段,那么在清除backbackback后,屏幕是空白的,虽然主片段接收onStart()和onResume(),并认为它是可见的,但它不会接收onPause(),onStop(),直到我再次添加另一个片段或离开应用程序。 另外,如果I
popBackstack()
一个接一个(在用户操作上)它工作正常,但是如果I
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);
}

新的支持库版本把事情搞砸了。更换后

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

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

一切正常

有一种新的FragmentTransaction方法(在版本25.1.0中添加)请参见:

尝试在FragmentTransaction上设置此选项,同时:

final FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();    
transaction.setAllowOptimization(true);
transaction.replace(...);
这为我解决了这个问题


归功于:

尝试
fragmentManager.popbackimmediate()。你确定你没有在代码中更改任何内容吗?不是100%,但我很确定我没有更改任何其他内容。