ナビゲーションタブ内でフラグメントが使用されている場合にフラグメントのビューステートを保持する方法を理解しようとしています。私の努力の中で、私は適切な解決策を見つけることができない2つの問題に遭遇しました。
Tab1とTab2の2つのタブがあります。Tab1のレイアウトはによって定義されFragmentA
、Tab2のレイアウトはによって定義されFragmentB
ます。私はここで与えられたアプローチに従いました(編集:この質問がされてからドキュメントが変更されました)。
最初の問題:ビューにIDがありますが、フラグメントが再アタッチされたとき(タブスイッチの回転後)、ビューの状態が完全に復元されません。特にEditText
、IDを持つanは実際に入力されたテキストを保存しますが、有効なステータスは保存しません。また、IDがある場合でも、ボタンが有効または無効になっている場合、ボタンは保存されません。この問題に対して考えられる2つの回避策を見つけました。
- タブを切り替えるときに
hide()/show()
代わりに使用します。attach()/detach()
- で、を介してフラグメントのインスタンス変数に
onPause()
現在のフラグメントビューステートを保存します。このフィールドがnullでないかどうかを確認し、そうである場合は、このフィールドの値を返します。この解決策はハッキーなようで、アプリにメモリリークが発生する可能性があると言われています。View
getView()
onCreateView(Bundle savedInstanceState)
2番目の問題:次のユーザーインタラクションを検討してください。ユーザーはTab1から開始し、Tab1のビューステートをデフォルトの状態とは異なる状態にするいくつかの変更を行います(フラグメントがタブスイッチとデバイスの傾きによってこのビューステートを保存するようにします) 。次に、ユーザーはTab2に移動します。次に、ユーザーは自分のデバイスを傾けます(まだTab2にあります)。次に、ユーザーはTab1に切り替えます(新しい画面の向きで)。ここで、問題は次のとおりです。ユーザーが最初にTab1からTab2にスワップすると、フラグメントが切り離され、その結果、ビューが破棄されます(フラグメントインスタンスはまだ存在していますが)。次にユーザーがデバイスを傾けると、アクティビティ(およびそれによって両方FragmentA
とそれにFragmentB
関連付けられている)が破棄されます。以来FragmentA
この時点でビューはなくなり(デタッチされたことを思い出してください)、への呼び出し中にビュー要素の状態(たとえば、どのボタンが有効/無効になっているか)を保存できませんFragmentA.onSaveInstanceState(Bundle savedInstanceState)
。このような状況でフラグメントビューの状態をどのように回復しますか?すべての単一のビュー要素の異なるステータスフラグをSharedPreferencesとして保存する唯一の実行可能なソリューションはありますか?これは、このような「日常の仕事」には複雑すぎるようです。