私は、ユーザーがViewPagerの複数のページを切り替えることを可能にするアプリケーションを設計しています。私はそれが画面上に表示されなくなったときにページからFragmentインスタンスを削除し、HashMapにキャッシュしてから、そのインスタンスを復元することができるようにするために苦労してきました。そのページに戻って、そのビュー内の他のものは削除前と同じ状態になります。たとえば、私の最初のページは、ログインに成功するとその特定のページの特定のレイアウト要素を表示/非表示にするログイン画面です。十分なページを前にして最初のページに戻すと、レイアウトがリセットされます。これは、巨大な水平/垂直スクロールグリッドのデータグリッドが含まれている私のページの別のものではより問題になり、初期化時にバックグラウンドでスレッドを使用して描画します。進捗状況のダイアログを使用して進捗状況をユーザーに通知し、ロードする度に本当に迷惑になります。Android:ViewpagerとFragmentStatePageAdapter
だから、私はFragmentStatePageAdapterのためのソースコードを閲覧し、destroyItem()コールバックで、削除されるフラグメント・インスタンスの状態は、ArrayListに保存されている...
をいくつかの研究をしました。 instantiateItem()コールバックでフラグメントの新しいインスタンスが作成されているときに、アイテムのインスタンスが存在しない場合(ArrayListを使用してこれを追跡している場合)、新しいFragmentインスタンスが作成され、対応するFragment.SavedStateデータで初期化されます。残念ながら、このデータにはビューの状態は含まれていませんが、GridView/ListViewのページではビューの状態が何らかの形で復元されていることがわかりました(ランダムな位置にスクロールして数ページを反転して戻ったリセットされません)。
APIによると:
保存状態は他の断片の依存関係を含むことができませんに - ので、それは フラグメント参照を格納するputFragment(バンドル、文字列、フラグメント)を使用することはできませんですこの 保存された状態が後で使用されるとき、その参照は有効でない可能性があります。同様に、フラグメントのターゲットおよび結果 コードはこの状態に含まれません。
私は最後の声明をよく理解していません。
つまり、ビューの状態をキャッシュする方法はありますか?もしそうでなければ、私は先に進み、すべてのフラグメントページをメモリに残すことになると思う。
を保存するためにonSaveInstanceState()を使用します。 – Scott