重新创建()活动时不会破坏碎片

Cas*_* Lo 8 android android-fragments

我有一个发送网络调用的支持库片段,以及recreate()收到特定网络响应时的父活动.我可以看到活动确实被重新创建,因为我可以看到onCreate()并被onDestroy()调用.

但是在重新创建活动之后,片段仍然存在,并且它被卡在循环中,不断重新创建并创建新片段.

这是onCreate()活动的一部分:

    if (someLogic()) {
        fragmentA = new FragmentA();
        FragmentUtil.addFragment(getSupportFragmentManager(), fragmentA);
    } else {
        fragmentB = new FragmentB();
        FragmentUtil.addFragment(getSupportFragmentManager(), fragmentB);
    }
Run Code Online (Sandbox Code Playgroud)

FragmentA是进行网络调用的那个,FragmentB是应该在之后显示的片段recreate().当我查看片段列表时,getSupportFragmentManager().getFragments()我看到1个FragmentA实例和16个FragmentB实例.

我的问题是为什么会发生这种情况,我该如何解决?

Ale*_*ood 14

调用recreate()实质上会导致Activity进行配置更改.配置更改会导致ActivityFragments 和s被销毁并重新创建.因此Fragment,当发生这种情况时,您的s实际上应该被销毁(您可以通过Log在片段的onDestroy方法中添加消息来亲眼看到).

配置更改导致碎片被破坏和创建的事实并不意味着FragmentManager遗嘱将简单地忘记曾经存在的碎片.在FragmentManager将仍持有参考到新创建的片段发生配置改变之后.

您可以做的一件事就是在您的活动中执行以下操作来防止创建多个片段onCreate():

if (savedInstanceState == null) {
    // The Activity is being created for the first time, so create and
    // add new fragments.
} else {
    // Otherwise, the activity is coming back after being destroyed.
    // The FragmentManager will restore the old Fragments so we don't
    // need to create any new ones here.
}
Run Code Online (Sandbox Code Playgroud)

  • 无论如何在娱乐过程中明确地不保留片段?我有一个日/夜模式布局设置,我有一些问题在内存中的片段的多个副本 (5认同)

Jem*_*rov 5

我遇到了与@spy 写的相同的情况,重新创建了ActivityDay/Night 模式更改后的情况。Activity有四个Fragments它们在被调用后被恢复Activity.recreate(),因为FragmentManager正如@Alex Lockwood 所说的那样保存它们。但是Fragments由于项目的一些建筑原因,在娱乐之后恢复和不添加对我没有帮助,我希望它们消失。

解决方法是删除FragmentsFragmentManager之前Activity.recreate()被调用时,在我的情况下,它是Activity.onStart()

FragmentManager fragmentManager = getSupportFragmentManager();
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();

Fragment fragmentA = fragmentManager.findFragmentByTag("fragmentATag");
if(fragmentA != null) 
    fragmentTransaction.remove(fragment);
// Find and delete other Fragments

fragmentTransaction.commit(); // or commitAllowingStateLoss()

recreate();
Run Code Online (Sandbox Code Playgroud)

这样你就不会FragmentsActivity.onCreate()被调用时恢复。