画面の回転で保存および復元できるようにしたいカスタムオブジェクトのArrayList
があります。
onSaveInstanceState
またはonRestoreInstanceState
を実装するArrayList
を独自のクラスにする場合、これはParcelable
およびSerializable
で実行できることを知っています。 。しかし、別のクラスを作成せずにこれを行う方法はありますか?
カスタムオブジェクトのArrayListを渡すために新しいクラスを作成する必要はありません。オブジェクトにParcelableクラスを実装し、onSaveInstanceState()
およびonRestoreInstanceState()
で Bundle#putParcelableArrayList() を使用するだけです。このメソッドは、ParcelablesのArrayListを単独で保存します。
Parcelables(およびSerializablesとBundles)の件名が頭を痛めることがあるため、ここにバンドルに保存されたカスタムParcelableオブジェクトを含むArrayListの基本的な例を示します。 (これは実行可能ファイルの切り取りと貼り付けであり、レイアウトは不要です。)
小包の実装
public class MyObject implements Parcelable {
String color;
String number;
public MyObject(String number, String color) {
this.color = color;
this.number = number;
}
private MyObject(Parcel in) {
color = in.readString();
number = in.readString();
}
public int describeContents() {
return 0;
}
@Override
public String toString() {
return number + ": " + color;
}
public void writeToParcel(Parcel out, int flags) {
out.writeString(color);
out.writeString(number);
}
public static final Parcelable.Creator<MyObject> CREATOR = new Parcelable.Creator<MyObject>() {
public MyObject createFromParcel(Parcel in) {
return new MyObject(in);
}
public MyObject[] newArray(int size) {
return new MyObject[size];
}
};
}
状態の保存/復元
public class Example extends ListActivity {
ArrayList<MyObject> list;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if(savedInstanceState == null || !savedInstanceState.containsKey("key")) {
String[] colors = {"black", "red", "orange", "cyan", "green", "yellow", "blue", "purple", "Magenta", "white"};
String[] numbers = {"one", "two", "three", "four", "five", "six", "seven", "eight", "nine", "ten"};
list = new ArrayList<MyObject>();
for(int i = 0; i < numbers.length; i++)
list.add(new MyObject(numbers[i], colors[i]));
}
else {
list = savedInstanceState.getParcelableArrayList("key");
}
setListAdapter(new ArrayAdapter<MyObject>(this, Android.R.layout.simple_list_item_1, list));
}
@Override
protected void onSaveInstanceState(Bundle outState) {
outState.putParcelableArrayList("key", list);
super.onSaveInstanceState(outState);
}
}
onRetainNonConfigurationInstance()
を使用できます。構成を変更する前にオブジェクトを保存し、getLastNonConfigurationInstanceState
()で復元できます。
アクティビティ内:
_ @Override
public Object onRetainNonConfigurationInstance() {
return myArrayList;
}
_
内部onCreate()
:
_ try{
ArrayList myArrayList = (ArrayList)getLastNonConfigurationInstance();
} catch(NullPointerException e) {}
_
ランタイム変更の処理: http://developer.Android.com/guide/topics/resources/runtime-changes.html ドキュメント: http://developer.Android.com/reference/ Android/app/Activity.html#onRetainNonConfigurationInstance%28%29
public void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
ArrayList<Integer> id=new ArrayList<>();
ArrayList<String> title=new ArrayList<>();
for(int i=0;i<arr.size();i++){
id.add(arr.get(i).id);
title.add(arr.get(i).title);
}
outState.putIntegerArrayList("id",id);
outState.putStringArrayList("title",title);
}