如何在Android中从一个活动发送日历对象到另一个活动?

5
我有一个日历对象,其中用户手动存储了一些日期和时间。我希望在下一个活动中可以使用这个对象。 我该怎么做?使用Parcelable的putextra方法存在差异。

当您使用Parcelable时,您遇到了什么差异? - Mohamed_AbdAllah
在一个长字段中使用gettime().gettime(),而在一个字符串中使用gettimezone().getid()就可以了(如果真的需要时区的话,但这完全没有可能)。 - njzk2
2个回答

13

日历(Calendar)没有实现Parcelable。

但是它似乎实现了Serializable接口,因此您可以将其序列化为一个字符串并将其作为Extra传递到其他活动中去。

另一种选择是使用cal.getTimeInMillis(),它会给你一个long类型的值,你可以将其添加为Intent的Extra。然后在另一个活动中提取它,并创建一个新的Calendar对象,立即调用setTimeInMillis()方法,这样它就会被设置为与旧活动中的Calendar对象相同的时间。


仅使用cal.getTimeInMillis()将丢失宝贵的时区信息。请参见答案https://dev59.com/JmzXa4cB1Zd3GeqPR0c-#33092555。 - johnw182

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接