5

我有一个日历对象,其中包含用户手动存储的一些日期和时间。我希望这个对象可以在下一个活动中使用。

我该怎么做?使用 Parcelable 的 putextra 方法存在差异。

4

2 回答 2

13

日历没有实现 Parcelable。

但是,它看起来确实实现了 Serializable,因此您可以将其序列化为字符串并将其作为 Extra 传递给您的其他活动。

您拥有的另一个选项是使用cal.getTimeInMillis()它将为您提供一个long您可以作为额外内容添加到您的意图的选项。然后你可以把它从另一边拉出来,创建一个新的 Calendar 对象并立即调用setTimeInMillis()它,这样它就会被设置为与旧活动中的 Calendar 对象相同的时间。

于 2012-12-19T14:49:55.970 回答
5

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(); 是一种选择,但我读到它很慢并且表现不佳,所以我选择避免它。

于 2015-10-13T01:05:43.303 回答