我们正在使用Fragments,我们不需要在重新创建Activity时自动恢复它们。
但是,每当Activity::onCreate(Bundle savedInstanceState)
- >调用super.onCreate(savedInstanceState)
,即使我们对这些片段使用setRetainInstance(false),也会恢复片段。
此外,在Fragments
Fragment.performCreateView()
中直接调用Fragment::onAttach()
,而不是通过Fragment
等等。另外,在恢复的ndroid:configChanges="orientation|screenSize|screenLayout
...
有人知道如何阻止Android恢复片段吗?
P.S。我们知道,如果要为配置更改重新创建活动,可以通过向清单添加{{1}}来完成。但是在自动内存清理的情况下重新创建活动呢?
答案 0 :(得分:41)
我们完成了添加到活动:
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(null);
}
它禁止在Activity的创建/重新创建周期中保存任何数据,并避免片段自动重新创建。
答案 1 :(得分:14)
@goRGon的答案对我来说非常有用,但是如果在重新创建后需要更多信息转发到您的活动,这样的使用会导致严重的问题。
这是改进版本,只删除"片段",但保留其他所有参数。
从捆绑包中删除的ID是android.support.v4.app.FragmentActivity
类的FRAGMENTS_TAG
字段的一部分。它当然可能会随着时间的推移而改变,但不是预期的。
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(createBundleNoFragmentRestore(savedInstanceState));
}
/**
* Improve bundle to prevent restoring of fragments.
* @param bundle bundle container
* @return improved bundle with removed "fragments parcelable"
*/
private static Bundle createBundleNoFragmentRestore(Bundle bundle) {
if (bundle != null) {
bundle.remove("android:support:fragments");
}
return bundle;
}
答案 2 :(得分:2)
当使用接受的答案中描述的方法时,使用ViewPager获得NPE的人请覆盖
ViewPager.onRestoreInstanceState(Parcelable state)
方法和调用
super.onRestoreInstanceState(null);
代替。
答案 3 :(得分:1)
我删除了Activity的onCreate中的片段。
答案 4 :(得分:0)
我还有一个ViewPager
所以我检查了fragmentMananger是否有片段并在onCreate()
中将其删除。
使用例如这个帖子:Remove all fragments from container。
FragmentManager fm = getSupportFragmentManager();
for (Fragment fragment: fm.getFragments()) {
fm.beginTransaction().remove(fragment).commitNow();
}
commitNow()
同步删除片段。
答案 5 :(得分:0)
我遇到TransactionTooLargeException
的问题。因此,值得庆幸的是,在使用tolargetool之后,我发现片段(android:support:fragments)处于内存中,并且事务变得太大。所以最后我做到了,效果很好。
@Override
public void onSaveInstanceState(final Bundle outState) {
super.onSaveInstanceState(outState);
outState.putSerializable("android:support:fragments", null);
}
答案 6 :(得分:-1)
查看未自动恢复的层次结构。因此,在Fragment.onCreateView()
或Activity.onCreate()
中,您必须恢复所有视图(从xml或以编程方式)。每个包含片段的ViewGroup必须具有与第一次创建时相同的ID。创建视图层次结构后,Android会恢复所有片段并将其视图放在右侧ViewGroup中,这要归功于ID。假设Android记住片段所在的ViewGroup的ID。这发生在onCreateView()
和onStart()
之间。