38

我们正在使用 Fragments,我们不需要在重新创建 Activity 时自动恢复它们。但是 Android 每次调用Activity::onCreate(Bundle savedInstanceState)->时super.onCreate(savedInstanceState)都会恢复 Fragments,即使我们对这些 Fragments 使用 setRetainInstance(false) 也是如此。

而且,在那些Fragments Fragment.performCreateView()是直接调用而不经过Fragment::onAttach()等等。另外,某些字段在还原内为空Fragment...

有人知道如何防止Android恢复片段吗?

PS我们知道,如果为配置更改重新创建活动,可以通过添加到清单中来完成ndroid:configChanges="orientation|screenSize|screenLayout。但是在自动内存清理的情况下重新创建活动呢?

4

7 回答 7

55

我们通过添加活动来完成:

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(null);
}

它禁止在 Activity 的创建/重新创建周期中保存的任何数据,并避免片段自动重新创建。

于 2013-03-28T13:34:10.743 回答
21

@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;
}
于 2016-09-27T10:44:10.070 回答
4

我遇到了问题TransactionTooLargeException。所以幸运的是,在使用tolargetool之后,我发现片段(android:support:fragments)在内存中,并且事务变得太大。所以最后我做了这个,效果很好。

@Override
public void onSaveInstanceState(final Bundle outState) {
    super.onSaveInstanceState(outState);
    outState.putSerializable("android:support:fragments", null);
}

编辑:我将它添加到活动中。就我而言,我有一个 Activity 应用程序和多个 Fragment。

于 2019-01-28T19:11:17.197 回答
3

那些使用已接受答案中描述的此方法时使用 ViewPager 获得 NPE 的人,请覆盖

ViewPager.onRestoreInstanceState(Parcelable state)

方法和调用

super.onRestoreInstanceState(null);

反而。

于 2017-03-10T04:48:18.587 回答
1

我删除了 Activity 的 onCreate 中的片段。

于 2016-05-05T04:59:26.100 回答
0

对于带有 的应用程序,我在创建之前ViewPager删除了 中的片段。onCreate()

基于这个线程:从容器中删除所有片段,我们有:

FragmentManager fm = getSupportFragmentManager();
for (Fragment fragment: fm.getFragments()) {
  fm.beginTransaction().remove(fragment).commitNow();
}
于 2018-04-28T19:46:08.113 回答
-1

视图层次结构不会自动恢复。因此,在Fragment.onCreateView()or中Activity.onCreate(),您必须恢复所有视图(从 xml 或以编程方式)。每个包含片段的 ViewGroup 必须具有与您第一次创建它时相同的 ID。创建视图层次结构后,Android 会恢复所有片段并将其视图放入正确的 ViewGroup 中,这要归功于 ID。假设 Android 会记住片段所在的 ViewGroup 的 ID。onCreateView()这发生在和之间onStart()

于 2013-11-12T09:28:43.053 回答