71

Fragment#setRetainInstance(true)がわかりにくいと思います。AndroidDeveloperAPIから抽出されたJavadocは次のとおりです。

public void setRetainInstance(ブール値保持)

フラグメントインスタンスがアクティビティの再作成(構成の変更など)全体で保持されるかどうかを制御します。これは、バックスタックにないフラグメントでのみ使用できます。設定されている場合、アクティビティが再作成されるときのフラグメントのライフサイクルはわずかに異なります。

  • onDestroy()は呼び出されません(ただし、フラグメントが現在のアクティビティから切り離されているため、onDetach()は呼び出されます)。
  • フラグメントが再作成されていないため、onCreate(Bundle)は呼び出されません。
  • onAttach(Activity)およびonActivityCreated(Bundle)引き続き呼び出されます。

質問:開発者としてこれをどのように使用しますか?また、なぜそれが物事を簡単にするのですか?

4

4 に答える 4

92

開発者としてこれをどのように使用しますか

を呼び出しsetRetainInstance(true)ます。私は通常、onCreateView()またはonActivityCreated()でそれを行います。

なぜそれが物事を簡単にするのですか?

onRetainNonConfigurationInstance()構成の変更(たとえば、デバイスを縦向きから横向きに回転させる)全体でデータの保持を処理する場合よりも簡単になる傾向があります。保持されていないフラグメントは、構成の変更時に破棄および再作成されます。保持されたフラグメントはそうではありません。したがって、これらの保持されたフラグメントによって保持されているデータは、構成変更後のアクティビティで利用できます。

于 2012-06-22T16:38:50.443 に答える
49

ソケットなどの長時間実行されるリソースを開いたままにしておくと非常に役立ちます。Bluetoothソケットへの参照を保持するUIのない​​フラグメントがあれば、ユーザーが電話を裏返したときにそれらを再接続することを心配する必要はありません。

また、ビットマップやサーバーデータなどの読み込みに時間がかかるリソースへの参照を保持するのにも便利です。一度ロードし、保持されたフラグメントに保持します。アクティビティがリロードされても、まだそこにあり、再構築する必要はありません。

于 2012-06-22T16:39:36.380 に答える
34

この回答は非常に遅く追加されましたが、それによって状況がより明確になると思いました。私の後に言ってください。いつsetRetainInstance

FALSE

  • フラグメントは、構成の変更時に再作成されます。NEWINSTANCEが作成されます。
  • onCreate()およびを含むすべてのライフサイクルメソッドは、構成の変更時に呼び出されますonDestroy()

TRUE

  • 構成を変更してもフラグメントは再作成されません。SAMEINSTANCEが使用されます。
  • すべてのライフサイクルメソッドは、構成の変更、APART FROM onCreate()、およびで呼び出されonDestroy()ます。
  • インスタンスの保持は、バックスタックに追加された場合は機能しません。

DialogFragment上記はフラグメントだけでなくsにも当てはまることを忘れないでください。

于 2013-09-08T08:23:36.430 に答える
5

setRetainInstance(boolean)メソッドは非推奨になりました。代わりに、ViewModelsを使用してください。

フラグメントのsetRetainInstance(boolean)メソッドは、フラグメントAPIのバージョン1.3.0で非推奨になりました。

ViewModelsの導入により、開発者は、アクティビティ、フラグメント、およびナビゲーショングラフに関連付けることができる状態を保持するための特定のAPIを使用できます。これにより、開発者は、保持されていない通常のフラグメントを使用して、保持したい特定の状態を個別に保持できます。

ViewModelこれにより、開発者は、単一の作成と単一の破棄(この場合、のコンストラクターとからのonCleared()コールバック)の有用なプロパティを維持しながら、それらのフラグメント(残りのフラグメントすべてに一致するもの)のライフサイクルをより理解しやすくなります。 ViewModel)。

于 2020-03-12T06:05:06.217 に答える