ユーザーが手動で保存した日付と時刻を持つ Calendar オブジェクトがあります。このオブジェクトを次のアクティビティで使用できるようにしたいと考えています。
どうすればいいのですか?Parcelable を使用した putextra メソッドでは、矛盾が生じています。
Calendarは Parcelable を実装していません。
ただし、Serializable を実装しているように見えるので、それを文字列にシリアル化し、それを Extra として他のアクティビティに渡すことができる場合があります。
あなたが持っている別のオプションは、それを使用して、インテントにエクストラとして追加できる をcal.getTimeInMillis()
提供することです。long
次に、反対側でそれを引き出して、新しい Calendar オブジェクトを作成し、すぐsetTimeInMillis()
にそれを呼び出して、古いアクティビティの Calendar オブジェクトと同じ時刻に設定することができます。
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(); はオプションですが、動作が遅く、パフォーマンスが悪いと読んだので、避けることにしました。