[解決済み] FragmentのsetRetainInstance(boolean)を理解する。
質問
ドキュメントから始める
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
その運用を管理する。参照
ブログ記事
をご覧ください。
一般的に、私はこの方法を
onConfigurationChanged
と
Activity
...方向転換を正しく実装/処理するのが面倒だからといって、応急処置的に使用するのはやめましょう。必要なときだけ使ってください。
関連
-
AAPT2エラーについて:詳しくはログをご確認ください。
-
[解決済み] Android Fragment onAttach() 非推奨
-
aapt2エラー:ログを確認する(具体的な原因の探り方)
-
GIF、Lottie、SVGA
-
ActivityはOnFragmentInteractionListenerを実装しなければならないに関する質問
-
android bluetooth--Bluetooth on、検索、ペアリング、接続
-
アンドロイドリストビュー
-
超シンプルなアンドロイドのタイムディレイ機能
-
[解決済み] フラグメントのインスタンス状態をバックスタックに正しく保存する方法は?
-
[解決済み] ViewPagerとフラグメント - フラグメントの状態を保存する正しい方法は何ですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
java.lang.NullPointerException: NULLオブジェクト参照で仮想メソッド......を呼び出そうとしました。
-
android.os の NetworkOnMainThreadException。
-
[android studio]com.android.ide.common.process.ProcessException: aaptの実行に失敗しました
-
android E/RecyclerView﹕ アダプタが接続されていないため、レイアウトをスキップする。
-
android:EMSのプロパティ
-
ライブラリをモジュールとしてインポートする際にエラーが発生しました。Error:A problem occurred configuring project ':library'.
-
Android--shape--描画のコーナー、グラデーション、パディング、サイズ、ソリッド、ストロークのプロパティを指定する。
-
Android TextViewは、テキスト内容が表示省略記号を超えているかどうかを判断する
-
android.content.ActivityNotFoundException を解決します。Intent問題を処理するActivityが見つからない
-
[解決済み] 新しいAndroid Fragmentをインスタンス化するためのベストプラクティス