2012-06-22 2 views
55

フラグメント#setRetainInstance(true)が混乱しています。なぜフラグメント#setRetainInstance(boolean)を使用しますか?

公共ボイドsetRetainInstance(ブール保持)

断片インスタンスが(例えば、構成変更のような)活性の再作成を横切って保持されているかどうかを制御:ここAndroid Developer APIから抽出されたJavadocは、です。これは、バックスタックにないフラグメントでのみ使用できます。設定した場合の活性が再作成される場合、断片のライフサイクルは、わずかに異なるであろう。

  • onDestroy()(断片は、その現在の活動から切り離されているため、依然として、あろうが、onDetach())が呼び出されません。
  • フラグメントが再作成されていないため、onCreate(Bundle)は呼び出されません。
  • onAttach(Activity)とonActivityCreated(Bundle)は、と呼ばれます。

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

+3

同様の質問:[フラグメントのsetRetainInstance(boolean)を理解する](http://stackoverflow.com/questions/11182180/understanding-fragments-setretaininstanceboolean) –

+1

'onDestroy()'デバイスが低い場合に呼び出されますメモリ上で –

答えて

72

開発者の使用この

コールsetRetainInstance(true)としてあなたをどのように行います。私は通常、それを使用するonCreateView()またはonActivityCreated()でそれを行います。

なぜ簡単にできますか?

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

+0

@CommonsWare - アクティビティに新しいフラグメントを作成し、そのアクティビティを再作成する場合、新しいフラグメントを再度作成しないでください。 – Neil

+4

@Neil:フラグメントが存在するかどうかを確認します(たとえば、 'findFragmentById()')。存在する場合は再作成しないでください。 – CommonsWare

+0

@CommonsWareフラグメントがビューとメモリ使用量が少し重い場合、良い開発者は何をすべきだと思いますか? –

41

これは、ソケットなどの長時間実行されているリソースを開いておくのに非常に役立ちます。ブルートゥースソケットへの参照を保持するUIのない​​断片があり、ユーザーが電話をめくったときに再接続する心配はありません。

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

+0

優れたヒント、ありがとう。 –

+0

これは大きなポイントです。 – StackOverflowed

+0

ニース。しかし、それらをリフレッシュする必要がある場合はどうすればよいですか? –

26

非常に遅れて追加されましたが、わかりやすくなると思いました。私の後に言ってください。 setRetainInstanceのとき:

  • FALSEフラグメントは、config変化に再作成されます。 NEW INSTANCEが作成されます。

  • すべてのライフサイクルメソッドは、onCreate()やonDestroy()などの設定変更時に呼び出されます。

TRUE

  • フラグメントは、設定変更時に再作成されません。 SAME INSTANCEが使用されます。
  • すべてのライフサイクルメソッドは、onCreate()およびonDestroy()からAPART変更時に呼び出されます。
  • インスタンスを保持することは、バックスタックに追加しても機能しません。

上記はDialogFragmentsとFragmentsに当てはまることを忘れないでください。良い情報と

+1

「バックスタックに追加するとインスタンスを保持することはできません。 ? – nmxprime

+1

@nmxprime here:http://developer.android.com/reference/android/app/Fragment.html#setRetainInstance(boolean) –

+1

バックスタックに追加された場合のフラグメントの状態を復元するにはどうすればよいですか? savedInstanceStateがnullで、setRetainInstanceを使用できません。 –

関連する問題