我有一个Calendar对象,其中有一些日期和时间由用户手动存储。 我希望此对象可用于下一个活动。
我该怎么做?使用Parcelable的putextra方法存在差异。
答案 0 :(得分:13)
Calendar未实现Parcelable。
它看起来确实实现了Serializable,因此您可以将其序列化为字符串并将其作为Extra传递给您的其他活动。
您拥有的另一个选择是使用cal.getTimeInMillis()
,它会为您提供一个long
,您可以将其作为额外添加到您的意图中。然后你可以在另一边拉出它并创建一个新的Calendar对象,并立即调用它上面的setTimeInMillis()
,这样它就可以设置为旧活动中Calendar对象的同时。
答案 1 :(得分:4)
cal.getTimeInMillis()是对的。 getTimeInMillis()的问题是你丢失了时区信息。因此,当读取该值时,UTC中的Calendar变量将转换为本地时区,可能会更改实际日期。
我不知道我是否有完美的答案,但我节省了时间(以毫秒为单位)和时区ID,因此我可以在另一侧完全重新创建日历对象。
public void writeToParcel(Parcel out, int flags) {
out.writeLong(mycal.getTimeInMillis());
out.writeString(mycal.getTimeZone().getID());
}
private MyClassObject(Parcel in) {
long milliseconds = in.readLong();
String timezone_id = in.readString();
mycal = new GregorianCalendar(TimeZone.getTimeZone(timezone_id));
mycal.setTimeInMillis(milliseconds);
}
out.writeSerializable();是一个选项,但我已经读到它很慢并且表现不佳,所以我选择了避免它。