38

フラグメントを使用しており、アクティビティが再作成されたときにフラグメントを自動的に回復する必要はありません。Activity::onCreate(Bundle savedInstanceState)ただし、Androidは、 ->が呼び出されるたびにsuper.onCreate(savedInstanceState)、フラグメントにsetRetainInstance(false)を使用している場合でも、フラグメントを復元します。

また、それらFragments Fragment.performCreateView()は通過せずに直接呼び出さFragment::onAttach()れます。さらに、一部のフィールドは復元された内部でnullになりますFragment...

Androidがフラグメントを復元しないようにする方法を知っている人はいますか?

PS構成変更のアクティビティを再作成する場合は、マニフェストにを追加することで実行できることがわかっていndroid:configChanges="orientation|screenSize|screenLayoutます。しかし、自動メモリクリーニングの場合にアクティビティを再作成するのはどうですか?

4

7 に答える 7

55

アクティビティに追加して終了しました。

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

アクティビティの作成/再作成サイクルで保存されたデータを抑制し、フラグメントの自動再作成を回避します。

于 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);
}

編集:アクティビティに追加しました。私の場合、1つのアクティビティアプリと複数のフラグメントがあります。

于 2019-01-28T19:11:17.197 に答える
3

受け入れられた回答に記載されているこの方法を使用したときにViewPagerでNPEを取得した人は、オーバーライドしてください

ViewPager.onRestoreInstanceState(Parcelable state)

メソッドと呼び出し

super.onRestoreInstanceState(null);

代わりは。

于 2017-03-10T04:48:18.587 に答える
1

アクティビティの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()またはActivity.onCreate()で、すべてのビューを(xmlからまたはプログラムで)復元する必要があります。フラグメントを含む各ViewGroupは、最初に作成したときと同じIDを持っている必要があります。ビュー階層が作成されると、Androidはすべてのフラグメントを復元し、IDのおかげでそれらのビューを適切なViewGroupに配置します。AndroidがフラグメントがあったViewGroupのIDを記憶しているとしましょう。onCreateView()これはとの間のどこかで発生しonStart()ます。

于 2013-11-12T09:28:43.053 に答える