我有一个日历对象,其中包含用户手动存储的一些日期和时间。我希望这个对象可以在下一个活动中使用。
我该怎么做?使用 Parcelable 的 putextra 方法存在差异。
日历没有实现 Parcelable。
但是,它看起来确实实现了 Serializable,因此您可以将其序列化为字符串并将其作为 Extra 传递给您的其他活动。
您拥有的另一个选项是使用cal.getTimeInMillis()
它将为您提供一个long
您可以作为额外内容添加到您的意图的选项。然后你可以把它从另一边拉出来,创建一个新的 Calendar 对象并立即调用setTimeInMillis()
它,这样它就会被设置为与旧活动中的 Calendar 对象相同的时间。
cal.getTimeInMillis() 是对的一半。仅 getTimeInMillis() 的问题是您丢失了时区信息。因此,UTC 中的日历变量将在读取该值时转换为本地时区,可能会更改实际日期。
我不知道我是否有完美的答案,但我以毫秒为单位保存了时间和时区 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(); 是一种选择,但我读到它很慢并且表现不佳,所以我选择避免它。