ユーザーが ViewPager で複数のページを切り替えることができるアプリを設計しています。Fragment インスタンスが画面に表示されなくなったときにページから Fragment インスタンスを削除し、それを (たとえば HashMap に) キャッシュしてから復元して、ユーザーがそのページに戻ると、ビューとその中の他のすべてが削除前と同じ状態になります。たとえば、私の最初のページは、ログインに成功したときに特定のページの特定のレイアウト要素を表示/非表示にするログイン画面です。十分な数のページをめくって最初のページに戻ると、レイアウトがリセットされます。これは、初期化時にバックグラウンドでスレッドを使用して描画するデータの巨大な水平/垂直スクロール グリッドを含む別のページでは、さらに問題になります。
というわけで色々調べてみた...
FragmentStatePageAdapter のソース コードを参照すると、destroyItem() コールバックで、削除される Fragment インスタンスの状態が ArrayList に保存されます。Fragment の新しいインスタンスが instantiateItem() コールバックで作成されているときに、アイテムのインスタンスがまだ存在しない場合 (ArrayList を使用してこれを追跡します)、新しい Fragment インスタンスが作成され、その状態が保存されます。対応する Fragment.SavedState データで初期化されます。残念ながら、このデータにはビューの状態は含まれていませんが、GridView/ListView を含むページの場合、ビューの状態が何らかの形で復元されていることに気付きました (ランダムな位置にスクロールし、いくつかのページをめくって戻ってきた場合)。 、リセットされません)。
APIによると:
保存された状態には、他のフラグメントへの依存関係を含めることはできません。つまり、 putFragment(Bundle, String, Fragment) を使用してフラグメント参照を格納することはできません。これは、この保存された状態が後で使用されるときにその参照が無効になる可能性があるためです。同様に、フラグメントのターゲット コードと結果コードはこの状態には含まれません。
Android の初心者なので、最後のステートメントを理解しているかどうかはよくわかりません。
そうは言っても、ビューの状態をキャッシュする方法はありますか? そうでない場合は、すべてのフラグメント ページをメモリに残しておいてください。