我有一个支持库片段,它发送网络调用,并在收到特定网络响应时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实例。
我的问题是为什么会发生这种情况,我该如何解决?
答案 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
后,Fragments
有Activity.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}}。