Android フレームワークと Fragment ライフサイクルを操作するonSaveInstanceState
には、Fragment にメソッドを実装する必要があります。簡単にするために、取得できる String 値の配列があると仮定しました (通常、ArrayAdapter を拡張して、ビューの構築をカプセル化し、基になるデータセット全体にアクセスするための便利なメソッドを提供します)。
public void onSaveInstanceState(Bundle savedState) {
super.onSaveInstanceState(savedState);
// Note: getValues() is a method in your ArrayAdapter subclass
String[] values = mAdapter.getValues();
savedState.putStringArray("myKey", values);
}
次に、次のように onCreate メソッド (または onCreateView または onActivityCreated - Fragment JavaDocを参照)でデータを取得できます。
public void onCreate (Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if (savedInstanceState != null) {
String[] values = savedInstanceState.getStringArray("myKey");
if (values != null) {
mAdapter = new MyAdapter(values);
}
}
...
}
これにより、デバイスのローテーションやユーザーによる他のアプリケーションへの切り替えなど、データを失うことなく、すべてのライフサイクル イベントが適切に処理されます。メモリを使用しないことonSaveInstanceState
とメモリを使用することの危険性は、Android がそのメモリを再利用する危険性です。保存された状態はこれによって影響を受けませんが、インスタンス変数または非表示のフラグメントを使用すると、データが失われます。
savedStateInstance
null の場合、復元する状態はありません。
これif (values != null)
は単に、配列が保存されていない可能性を防ぐためのものですが、ArrayAdapter をコーディングして null データ セットを処理する場合、これは必要ありません。
行が独自のクラスの 1 つのインスタンスであり、単一のデータ項目ではない場合、最終的な解決策は、そのクラスに Parcelable インターフェイスを実装することsavedState.putParcelableArray("myKey", myArray)
です。Parcelable の実装方法を知っていると、驚くほど便利です。これにより、インテント内でクラスを渡すことができ、よりクリーンなコードを記述できるようになります。