1. ホーム
  2. android

[解決済み] FragmentのsetRetainInstance(boolean)を理解する。

2022-03-15 18:27:26

質問

ドキュメントから始める

public void setRetainInstance (boolean retain)

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

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

いくつか質問があります。

  • フラグメントはビューも保持するのでしょうか、それとも設定変更時に再作成されるのでしょうか?また、設定変更時に再作成されるのでしょうか?

  • ユーザーがアクティビティから離れると、フラグメントは破棄されるのですか?

  • なぜバックスタックにあるフラグメントでは動作しないのですか?

  • この方法を使う意味のあるユースケースはどれですか?

どのように解決するのですか?

まず最初に 私の投稿 をリテインド・フラグメントに追加しました。参考になるかもしれません。

では、質問にお答えします。

フラグメントは、その ビュー それとも設定変更時に再作成されるのでしょうか?

そうです。 Fragment の状態は、設定の変更に関わらず保持されます。具体的には、quot;retain" は、フラグメントが以下のようになることを意味します。 ない は設定変更時に破棄される。つまり Fragment になります。 保持 設定変更により Activity が破壊される。

ユーザーがアクティビティから離れると、フラグメントは破棄されるのでしょうか?

と同じように Activity s, Fragment は、メモリリソースが少なくなると、システムによって破棄されることがあります。設定を変更してもフラグメントのインスタンス状態を保持させるかどうかは、システムが Fragment を残すと Activity . もし Activity (ホームボタンを押すなど)すると Fragment が破壊される場合と破壊されない場合があります。を残しておくと Activity 戻るボタンで(つまり finish() を破壊し、実質的に Activity を含む)、すべての Activity に付属する Fragment も破棄されます。

バックスタックにあるフラグメントではうまくいかないのはなぜですか?

対応していない理由は複数あると思われますが、私にとって一番わかりやすい理由は Activity への参照を保持します。 FragmentManager であり FragmentManager はバックスタックを管理します。つまり、あなたがあなたの Fragment を使用するかどうかは Activity (したがって FragmentManager のバックスタック)は設定変更時に破棄されます。うまくいかないもうひとつの理由は、保持されているフラグメントの両方が 非保持フラグメントが同じバックスタックに存在することを許可しています。

この方法を使う意味があるユースケースはどれでしょうか?

保持されたフラグメントは、アクティビティ・インスタンス間で状態情報(特にスレッド管理)を伝搬するのに非常に便利な場合があります。たとえば、フラグメントは Thread または AsyncTask その運用を管理する。参照 ブログ記事 をご覧ください。

一般的に、私はこの方法を onConfigurationChangedActivity ...方向転換を正しく実装/処理するのが面倒だからといって、応急処置的に使用するのはやめましょう。必要なときだけ使ってください。