ナビゲーションタブ内でフラグメントを使用すると、フラグメントビューの状態を保持する方法を理解しようとしています。私の努力の中で、私は適切な解決策を見つけることができない2つの問題に出くわしました。Androidのナビゲーションタブ:フラグメントビューの状態を復元する
私は2つのタブ、Tab1とTab2を持っています。 Tab1のレイアウトはFragmentAで定義され、Tab2のレイアウトはFragmentBで定義されます。 Adding navigation tabs
最初の問題: 私はここに与えられたアプローチに続いてきた私の見解は、IDを持っているにもかかわらずを断片が再装着された場合には、それらの状態は完全に(タブの切り替え回転後)に復元されていません。具体的には、IDを持つEditTextは実際に入力されたテキストを保存しますが、有効なステータスは保存されません。また、私のボタンは、IDを持っていても有効または無効にすると保存されません。タブを切り替えるhide()/show()
代わりのattach()/detach()
- 用途:私はこの問題の2つの回避策を見つけました。
- に
onPause()
getView()
でフラグメントのインスタンス変数View
に現在のフラグメントビューの状態を保存します。onCreateView(Bundle savedInstanceState)
でこのフィールドがnullでないかどうかをチェックし、そうである場合はこのフィールドの値を返します。このソリューションはハックのようだ、私はそれも私のアプリでメモリリークを導入するかもしれないと言われてきた。
第二の問題:には、次のユーザーとの対話を考えてみましょう: ユーザーはTab1を上起動し、デフォルトの状態とは異なる状態にTab1をのビューステートを入れていくつかの変更を行います(と私たちは、フラグメントが保存したいですタブスイッチとデバイスの傾きによるこのビューの状態)。 ユーザーはTab2に行きます。ユーザーは彼女/彼のデバイスを傾けます(まだTab2にあります)。 その後、ユーザーはTab1(新しい画面方向)にスワップします。 問題は次のとおりです。ユーザーが最初にTab1からTab2にスワップすると、フラグメントがデタッチされ、そのビューが破棄されます(ただし、フラグメントインスタンスはまだ存続しています)。ユーザーがデバイスを傾けると、アクティビティー、それに関連付けられたFragmentAとFragmentBの両方が破棄されます。この時点でのFragmentAはビューをもはや持たないので(それはデタッチされていたことを覚えておいてください)、FragmentA.onSaveInstanceState(Bundle savedInstanceState)
への呼び出し中に、ビュー要素の状態(例えば、どのボタンが有効/無効)を保存できません。このような状況でフラグメントビューの状態をどのように回復しますか?すべての単一のビュー要素の異なるステータスフラグをSharedPreferencesとして保存する唯一の実行可能なソリューションですか?このような「日常の仕事」では、これはあまりにも複雑なようです。
私はSOやさまざまなブログの記事を読んできましたが、この(特定の)問題の解決策を見つけることができませんでした。
多くのありがとう - 良い説明。しかし、事はまだ私には完全にはっきりしていません。私はあなたが指している答えを見てきましたが、私はその使い方を理解できませんでした。 「CustomView」とは何ですか?私のフラグメントビューの状態は、(EditTexts、Buttonsなどの)ビューのみで構成されています。したがって、私はViewクラスを拡張していません - 私は単にxmlレイアウトファイル内にフラグメントビューを構築しました。回答に提供されたサンプルコードを、ユーザー定義のビューを使用しないレイアウトに接続するにはどうすればいいですか?(CustomViewはアンドロイドにユーザー定義のコントロールをASP .NETとすると仮定します) –
@jvmk View.onSaveInstanceState()を使用するには、Viewをサブクラス化してそのメソッドをオーバーライドする必要があります。レイアウトXMLは、EditText/Buttonではなく、これらの新しいビューを参照する必要があります。 – antonyt
うわー、それは気違いです。ビューに組み込まれたビューの状態を復元することは、これが標準機能としてサポートされるのに十分頻繁に再発するタスクであると考えました。将来の使用のためにライブラリを書く必要があるとします。ここで私を助けてくれてありがとう。これは今、2週間私に迷惑をかける。 –