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

时间:2014-11-10 17:55:00

标签: android android-fragments

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

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

以下是活动onCreate()的一部分:

    if (someLogic()) {
        fragmentA = new FragmentA();
        FragmentUtil.addFragment(getSupportFragmentManager(), fragmentA);
    } else {
        fragmentB = new FragmentB();
        FragmentUtil.addFragment(getSupportFragmentManager(), fragmentB);
    }

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

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

2 个答案:

答案 0 :(得分:12)

调用recreate()实际上会导致Activity进行配置更改。配置更改会导致Activity及其Fragment被销毁并重新创建。因此,当发生这种情况时,您的Fragment实际上应该被销毁(您可以通过在片段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.
}

答案 1 :(得分:2)

我和@spy写的情况相同,在日/夜模式改变后重新创建Activity。调用Activity后,FragmentsActivity.recreate()FragmentManager 恢复,因为Fragments将其保存为@Alex Lockwood所说的。但是,由于项目的一些架构原因,恢复并且不在娱乐后添加Fragments对我没有帮助,我希望它们消失。

解决方案是在调用FragmentManager之前从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();

Fragments

这样,在调用Activity.onCreate()时,您无法恢复{{1}}。