我们使用的片段,我们也不需要他们时,活动重新创建自动恢复。 但是Android每当一次Activity::onCreate(Bundle savedInstanceState)
- > super.onCreate(savedInstanceState)
被调用,即使我们使用的那些片段setRetainInstance(假)恢复片段。
此外,在那些Fragments
Fragment.performCreateView()
被直接调用,而无需通过去Fragment::onAttach()
等。 另外,一些字段的恢复内部空Fragment
...
有谁知道如何防止从Android的碎片恢复?
PS我们知道,在重建的配置活动的情况下改变它才能被加入到表现出一种做ndroid:configChanges="orientation|screenSize|screenLayout
但有关自动记忆洗涤的情况下重新创建活动是什么?
我们完成了加入到活动:
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(null);
}
它抑制任何保存在一个活动的创建/重建周期的数据,避免了碎片自动重新创建。
@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;
}
那些谁与ViewPager了NPE在使用时在接受的答案描述这个方法,请重写
ViewPager.onRestoreInstanceState(Parcelable state)
方法和呼叫
super.onRestoreInstanceState(null);
代替。
我也有一个ViewPager
所以我检查了fragmentMananger如果它有它的片段,并删除他们onCreate()
例如使用这个线程: 从容器中取出所有碎片 。
FragmentManager fm = getSupportFragmentManager();
for (Fragment fragment: fm.getFragments()) {
fm.beginTransaction().remove(fragment).commitNow();
}
commitNow()
到synchronosly除去碎片。
我有一个问题TransactionTooLargeException
。 因此,使用后令人欣慰的tolargetool我创办的片段(机器人:支持:片段)是一直在内存中,交易变得过大。 所以,最后我做到这一点,这真是棒极了。
@Override
public void onSaveInstanceState(final Bundle outState) {
super.onSaveInstanceState(outState);
outState.putSerializable("android:support:fragments", null);
}
查看层次结构不会自动恢复。 所以,在Fragment.onCreateView()
或Activity.onCreate()
你必须恢复所有视图(从XML或以编程方式)。 包含片段每个ViewGroup中,当你创建它的第一次必须具有相同的ID。 一旦视图层次被创建,Android的恢复所有碎片,并把他们的意见的权利的ViewGroup感谢ID英寸 让说,Android的记得一个ViewGroup上一个片段的ID。 出现这种情况介于onCreateView()
和onStart()