28

Fragment#setRetainInstance(boolean) を使用する理由について言及しています。

私がそのようにお願いする理由は、Activityローテーションを処理するためです。公式アクティビティ ドキュメントActivityでは、ローテーション中にシャットダウンして再起動することを推奨しています。

android:configChanges アクティビティがそれ自体で処理する構成変更を一覧表示します。実行時に構成の変更が発生すると、アクティビティはデフォルトでシャットダウンされて再開されますが、この属性を使用して構成を宣言すると、アクティビティが再開されなくなります。代わりに、アクティビティは実行されたままになり、その onConfigurationChanged() メソッドが呼び出されます。注: この属性の使用は避け、最後の手段としてのみ使用してください。構成の変更による再起動を適切に処理する方法の詳細については、ランタイムの変更の処理を参照してください。

このアクティビティのデフォルトの動作を変更しようとする試みは、悪い習慣のようです。再起動中にアクティビティが時間のかかるデータ構造をリロードするのを避けるために、 と を使用onRetainNonConfigurationInstancegetLastNonConfigurationInstanceます。-公式処理ランタイムの変更

ただし、Fragment でのローテーションの処理に関しては、Google は別の推奨事項を提供していますか? Fragment をシャットダウンして再起動することを望まないのですか?

public Object onRetainNonConfigurationInstance ()

このメソッドは、API レベル 13 で廃止されました。代わりに、新しい Fragment API setRetainInstance(boolean) を使用してください。これは、Android 互換性パッケージを通じて古いプラットフォームでも利用できます。

  1. ローテーション中にアクティビティをシャットダウンして再起動することを Google が推奨するのに、ローテーション中にフラグメントを保持することを推奨するのはなぜですか?
  2. がローテーションの処理に優れている場合setRetainInstance(true)、Google はそれを Fragment のデフォルトの動作にしないのはなぜですか?
4

2 に答える 2

33
  • 構成の変更: 突然画面が非常に広くなり、高さが非常に低くなった場合 (典型的な風景)、視覚コンポーネントがその表示を更新し、利用可能な画面をよりインテリジェントに使用する傾向があります。構成変更の別の例としては、ユーザーによるハードウェア キーボードのスライド、デバイス言語の変更などがあります。再起動する理由:

    • Android コンポーネントは宣言型レイアウトを好むため、一連の XML レイアウトをロードして、そこから作業します。すべてのビューを見つけてリアルタイムで再配置/更新するのは面倒です。すべてのイベント ハンドラーやその他のカスタム ビュー コードの再配線は言うまでもありません。別のレイアウト ファイルの束をリロードする方が簡単です。

    • また、Android では、アクティビティはシステムに翻弄されて生きているので、当然、アクティビティのライフ サイクルは、以前と同じようにいつでも必要に応じて再作成できるように設計 (および推奨) されています。破壊されました。このパターンは、構成の変更によるものも含め、すべての再起動に対応します。アクティビティとフラグメントを永続的な状態に維持できるようにすると、構成の変更はそれほど問題になりません。

    • それを表示するもの (UI とビュー) ではなく、状態データ (モデル) を保持します。

  • setRetainInstance(true) : ローテーションで再作成される、何への参照も保持しないフラグメントでのみ使用することをお勧めします。つまり、コンテキスト、ビューなどを保持するフラグメントでは使用しないでください。典型的なビジュアル フラグメントは使用します。ただし、実行中のスレッド、AsyncTask、データ コレクション、ロードされたアセット、フェッチされた結果などのオブジェクトを保持するフラグメントでは非常に便利です。この方法は、アクティビティのコンテキストに依存しないオブジェクトに対して、非ビジュアル フラグメントを取り外し可能なホルダーとして使用するのに役立ちます。 .

于 2013-02-25T11:59:40.943 に答える
4

使い方を誤解しているからです。setRetainInstance(true)ソロ要素/モジュールのようなフラグメントでのみ使用する必要があります。ソケットなどを処理し、GUI を持たないフラグメントは、保持されることで本当にメリットがあります。GUI を使用するフラグメントでは、おそらく を使用しないでくださいsetRetainInstance(true)。また、バックスタックに移動するフラグメントは使用しないでくださいsetRetainIstance(true)

データ/接続などのみを処理するフラグメントに一般化できます。使用する必要がありますsetRetainInstance(true)。しかし、Fragments を使用するさまざまな方法が多数あり、setRetainInstance(true).

于 2013-02-25T11:54:29.660 に答える