弹出回退栈后,碎片不可见。

5

我在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);
}

尝试使用 fragmentManager.popBackStackImmediate() - Kamran Ahmed
@KamranAhmed 它并没有改变任何事情。 - FullRandom
2个回答

4

2
原来新的支持库版本搞砸了一些东西。修改后,我们需要在build.gradle文件中将旧版本的支持库替换为新版本,然后重新构建项目即可解决问题。
compile 'com.android.support:appcompat-v7:25.1.1'

返回

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

一切正常运作良好。


我有完全相同的问题,更改库版本没有帮助。你确定你没有在代码中改变任何东西吗? - 4gus71n
1
不是100%确定,但我相当肯定我没有改变其他任何东西。 - FullRandom

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接