Intentで独自クラスを渡す
直列化とコレクション、永続化 - mixi-inc/AndroidTraining
の「コレクション・直列化」の課題2で、以下のフィールドを持つ User クラスを作成した。
public class User { private int id; private String name; private int age; private String keyword; private Calendar joinDate; private Status status; public static class Status { private Calendar postedTime; private String text; } }
これをIntentで別Activityに渡す際、Parcelable を implements する必要があるが、さらに writeToParcel で書き出し、User で読み出す必要がある。
このとき、Calendar 型は long にしてしまえば writeLong(), readLong() で読み書きできるが、インナークラスの Status をどうして良いか一旦詰まった(DetailActivity で Status が null になり、TextView に値をセットする際にぬるぽが発生する)。
が、Status クラスに Serializable を implements してしまえば writeSerializable(), readSerializable() で読み書きできることが分かった。
public class User implements Parcelable { public static final Parcelable.Creator<User> CREATOR = new Parcelable.Creator<User>() { public User createFromParcel(Parcel in) { return new User(in); } public User[] newArray(int size) { return new User[size]; } }; public User() {} private User(Parcel in) { id = in.readInt(); name = in.readString(); age = in.readInt(); keyword = in.readString(); joinDate = new GregorianCalendar(); joinDate.setTimeInMillis(in.readLong()); status = (Status)in.readSerializable(); } @Override public int describeContents() { return 0; } @Override public void writeToParcel(Parcel out, int flags) { out.writeInt(id); out.writeString(name); out.writeInt(age); out.writeString(keyword); out.writeLong(joinDate.getTimeInMillis()); out.writeSerializable(status); } private int id; private String name; private int age; private String keyword; private Calendar joinDate; private Status status; public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public String getKeyword() { return keyword; } public void setKeyword(String keyword) { this.keyword = keyword; } public Calendar getJoinDate() { return joinDate; } public void setJoinDate(Calendar joinDate) { this.joinDate = joinDate; } public Status getStatus() { return status; } public void setStatus(Status status) { this.status = status; } public static class Status implements Serializable { private Calendar postedTime; private String text; public Calendar getPostedTime() { return postedTime; } public String getText() { return text; } public void setPostedTime(Calendar date) { postedTime = date; } public void setText(String txt) { text = txt; } } }
このようにしておけば、
MainActivity
intent.putExtra("userData", usr2);
startActivity(intent);
DetailActivity
Bundle extras = getIntent().getExtras();
User user = extras.getParcelable("userData");
で受け渡しが出来る。