バックグラウンド:
私には mainがあり、変更可能Activity
な main をラップしています。Fragment
バックスタックを保持するために、 のバックスタックを使用していますFragmentManager
。
アクティビティ スタックを維持することとの主な違いは、フラグメントがバックスタックにプッシュされて置き換えられると、それは呼び出されますが、それは呼び出されonDestroyView()
ずonDestroy()
、返されるとビューが で再作成されることonCreateView()
です。(ただしonCreate()
、フラグメント オブジェクトが破棄されないため、呼び出されません)
アクティビティ スタックでは発生せず、ビューは残ります。
Android OS はメモリをいくらか解放でき、ビューを正しく維持する必要がないため (私のアプリでは、サーバーからのメッセージがいつでもビューを変更する可能性があります)、貴重なデータを節約できるため、これはローエンド デバイスにプラスの効果があります。帯域幅も。
実際の問題:
フラグメントがあり、ユーザーが何かをクリックすると、ビューが変更されたとします。たとえば、リストが展開されます。
その後、ユーザーが別の画面 (つまりフラグメント) に移動すると、前のフラグメントがバックスタックにプッシュされ、そのビューが破棄されます。
ユーザーが元に戻ると、フラグメントが再作成され、ユーザーが行った変更を「記憶」しません。たとえば、リストが適切に展開されません。
では、すべてのビューに特別なケースを作成せずに、状態を保存して復元するにはどうすればよいでしょうか?
望ましくない回答:
- ビューを維持する: ビューを維持するために何かを行うと、フラグメントの効率が低下します
- using
onSaveInstanceState()
: アクティビティが破棄されておらず、構成の変更ではないため、フラグメントがバックスタックにプッシュされたときに呼び出されません。 - 特別なオブジェクト: システムがそれを実行できる方法がある場合は、実行しないことをお勧めします。