redev

technical miscellaneous memorandum

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");

で受け渡しが出来る。