2012-12-19 49 views
3

我有一個日曆對象,用戶手動存儲一些日期和時間。 我希望此對象可用於下一個活動。如何在Android中將日曆對象從一項活動發送到另一項活動?

我該怎麼做?使用Parcelable的putextra方法會產生差異。

+0

當您使用Parcelable時,您會得到什麼不一致? –

+0

gettime()。gettime()在長字段中,並且gettimezone()。getid()在字符串中應該做。 (如果你真的需要時區,那是(這是完全不可能的)) – njzk2

回答

12

Calendar沒有實現Parcelable。

但它看起來好像實現了Serializable,所以你可以將它序列化爲一個字符串並將它作爲Extra傳遞給其他活動。

你的另一個選擇是使用cal.getTimeInMillis()這將給你一個long,你可以添加一個額外的意圖。然後你可以把它拉出另一邊,並創建一個新的日曆對象,並立即調用setTimeInMillis(),以便它將被設置爲與舊活動中的日曆對象相同的時間。

+0

只要使用cal.getTimeInMillis()將會失去重要的TimeZone信息。請參閱http://stackoverflow.com/a/33092555/1550233的答案 – johnw182

4

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();是一種選擇,但我已經讀過,它是低迷,表現不佳,所以我選擇避免它。

相關問題