書きました。
Android Bundle で状態を保存
ここでは、Bundle の Method (例えば putString と getString)
を使ってパラメータを保存する方法を紹介しました。
しかーし、ここで問題が発生
「独自にデータクラスを用意していて、このクラスのメンバごと保存したいんだけど…」
さぁ、この場合どうする?
ここで登場するのが Parcelable さんです。
Parcelable はリファレンス
http://developer.android.com/intl/ja/reference/android/os/Parcelable.html
に書いてあるように、Parcel にデータを書き/読みするためのインタフェースです。
"Interface for classes whose instances can be written to and restored from a Parcel. Classes implementing the Parcelable interface must also have a static field called CREATOR, which is an object implementing the Parcelable.Creator interface. "
Parcelable インタフェースを実装したクラスは、Parcelable.Creator インタフェースを実装するオブジェクトである CREATOR と呼ばれる静的フィールドを持たなくてはなりません。
そして、ご丁寧に Parcelable インタフェースを実装するクラスの例が載ってます。
public class MyParcelable implements Parcelable {
private int mData;
public int describeContents() {
return 0;
}
public void writeToParcel(Parcel out, int flags) {
out.writeInt(mData);
}
public static final Parcelable.Creator<MyParcelable> CREATOR
= new Parcelable.Creator<MyParcelable>() {
public MyParcelable createFromParcel(Parcel in) {
return new MyParcelable(in);
}
public MyParcelable[] newArray(int size) {
return new MyParcelable[size];
}
};
private MyParcelable(Parcel in) {
mData = in.readInt();
}
}
ここでは、Parcel に保存するパラメータとして、mData が1つですが、
例えば、名前、年齢、アドレスをメンバに持つ
クラス(ContactParcelable)を作るとこんな感じになります。
public class ContactParcelable implements Parcelable {
private String name;
private int age;
private String address;
public int describeContents() {
return 0;
}
public void writeToParcel(Parcel out, int flags) {
out.writeString(name);
out.writeInt(age);
out.writeString(address);
}
public static final Parcelable.Creator<ContactParcelable> CREATOR
= new Parcelable.Creator<ContactParcelable>() {
public ContactParcelable createFromParcel(Parcel in) {
return new ContactParcelable(in);
}
public ContactParcelable[] newArray(int size) {
return new ContactParcelable[size];
}
};
private ContactParcelable(Parcel in) {
name = in.readString();
age = in.readInt();
address = in.readString();
}
public ContactParcelable(String name, int age, String address) {
this.name = name;
this.age = age;
this.address = address;
}
}
writeToParcel(Parcel out, int flags)
で書き込む順番と
ContactParcelable(Parcel in)
で読み出す順番は同じにしなければなりません。
で、このクラスを
onSaveInstanceState(Bundle) で保存し、
onRestoreInstanceState(Bundle)
で読み出すには、こんな感じでOK
ContactParcelable contactParcelable;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
contactParcelable = new ContactParcelable("あんどろいど", 2, "android@gmail.com");
}
@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
/* ここで状態を保存 */
outState.putParcelable("contact", contactParcelable);
}
@Override
protected void onRestoreInstanceState(Bundle savedInstanceState) {
super.onRestoreInstanceState(savedInstanceState);
/* ここで保存した状態を読み出して設定 */
contactParcelable = savedInstanceState.getParcelable("contact");
}
さらにさらに、
もし、メンバがデータクラスのリストだった場合はどうなるか
この場合も Parcelable を実装します。
ContactParcelable のリストをメンバに持つ AllContactParcelable
を一時保存する場合
public class AllContactParcelable implements Parcelable {
private ArrayList<ContactParcelable> contactList;
public int describeContents() {
return 0;
}
public void writeToParcel(Parcel out, int flags) {
out.writeTypedList(contactList);
}
public static final Parcelable.Creator<AllContactParcelable> CREATOR
= new Parcelable.Creator<AllContactParcelable>() {
public AllContactParcelable createFromParcel(Parcel in) {
return new AllContactParcelable(in);
}
public AllContactParcelable[] newArray(int size) {
return new AllContactParcelable[size];
}
};
private AllContactParcelable(Parcel in) {
contactList = in.createTypedArrayList(ContactParcelable.CREATOR);
}
public AllContactParcelable(ArrayList<ContactParcelable> contactList) {
this.contactList = contactList;
}
}
out.writeTypedList(contactList);
で書き込みし、
contactList = in.createTypedArrayList(ContactParcelable.CREATOR);
で読み出すのがポイント
onSaveInstanceState(Bundle)
と
onRestoreInstanceState(Bundle)
での実装は同じ
参考ページ
・[Android] android.os.Parcelable / Parcel
adakodaさんありがとうございます!
・http://developer.android.com/intl/ja/reference/android/os/Bundle.html
・http://developer.android.com/intl/ja/reference/android/os/Bundle.html#putParcelable%28java.lang.String,%20android.os.Parcelable%29
・http://developer.android.com/intl/ja/reference/android/os/Bundle.html#getParcelable%28java.lang.String%29
0 件のコメント:
コメントを投稿