我基本上要做的是将Parcelable对象作为Intent extra传递。
这是我传递的地方,
final Intent intent = new Intent(_context,
AddReminderActivity.class);
final Bundle bundle = new Bundle();
bundle.putString(AddReminderActivity.EXTRA_MODE, AddReminderActivity.MODE_EDIT);
bundle.putParcelable(AddReminderActivity.EXTRA_REMINDER, _reminders.get(position));
intent.putExtras(bundle);
_context.startActivity(intent);
_reminders
是ArrayList<Reminder>
这是我的Reminder
班级
package au.com.elegantmedia.vetcheck.objects;
import android.os.Parcel;
import android.os.Parcelable;
public class Reminder implements Parcelable {
private long _id;
private String _message = "n/a";
private String _medication = "n/a";
private String _dosage = "n/a";
private String _date = "n/a";
private String _time = "n/a";
private int _repeatID = 0; // 1-once, 2-hourly, 3-daily, 4-weekly, 5-monthly
private String _repeat = "n/a";
private int _requestCode = 0;
private static int REPEAT_ID_ONCE = 1;
private static String REPEAT_ONCE = "once";
private static int REPEAT_ID_HOURLY = 2;
private static String REPEAT_HOURLY = "hourly";
private static int REPEAT_ID_DAILY = 3;
private static String REPEAT_DAILY = "daily";
private static int REPEAT_ID_WEEKLY = 4;
private static String REPEAT_WEEKLY = "weekly";
private static int REPEAT_ID_MONTHLY = 5;
private static String REPEAT_MONTHLY = "monthly";
public Reminder() {
// TODO Auto-generated constructor stub
}
public Reminder(Parcel source) {
_id = source.readInt();
_message = source.readString();
_medication = source.readString();
_dosage = source.readString();
_date = source.readString();
_time = source.readString();
_repeatID = source.readInt();
_repeat = source.readString();
_requestCode = source.readInt();
}
public long getID() {
return _id;
}
public void setID(long id) {
_id = id;
}
public String getMessage() {
return _message;
}
public void setMessage(String message) {
if(!message.equals("")) {
_message = message;
}
}
public String getMedication() {
return _medication;
}
public void setMedication(String medication) {
if(!medication.equals("")) {
_medication = medication;
}
}
public String getDosage() {
return _dosage;
}
public void setDosage(String dosage) {
if(!dosage.equals("")) {
_dosage = dosage;
}
}
public String getDate() {
return _date;
}
public void setDate(String date) {
if(!date.equals("")) {
_date = date;
}
}
public String getTime() {
return _time;
}
public void setTime(String time) {
if(!time.equals("")) {
_time = time;
}
}
public void setRepeatID(String repeat) {
if(repeat.equals(REPEAT_ONCE)) {
_repeatID = REPEAT_ID_ONCE;
}
else if(repeat.equals(REPEAT_HOURLY)) {
_repeatID = REPEAT_ID_HOURLY;
}
else if(repeat.equals(REPEAT_DAILY)) {
_repeatID = REPEAT_ID_DAILY;
}
else if(repeat.equals(REPEAT_WEEKLY)) {
_repeatID = REPEAT_ID_WEEKLY;
}
else if(repeat.equals(REPEAT_MONTHLY)) {
_repeatID = REPEAT_ID_MONTHLY;
}
}
public int getRepeatID() {
return _repeatID;
}
public void setRepeat(int repeatID) {
_repeatID = repeatID;
if(repeatID == REPEAT_ID_ONCE) {
_repeat = REPEAT_ONCE;
}
else if(repeatID == REPEAT_ID_HOURLY) {
_repeat = REPEAT_HOURLY;
}
else if(repeatID == REPEAT_ID_DAILY) {
_repeat = REPEAT_DAILY;
}
else if(repeatID == REPEAT_ID_WEEKLY) {
_repeat = REPEAT_WEEKLY;
}
else if(repeatID == REPEAT_ID_MONTHLY) {
_repeat = REPEAT_MONTHLY;
}
}
public String getRepeat() {
return _repeat;
}
public void setRequestCode(int requestID) {
_requestCode = requestID;
}
public int getRequestCode() {
return _requestCode;
}
// parceling part
public static final Parcelable.Creator<Reminder> CREATOR = new Parcelable.Creator<Reminder>() {
@Override
public Reminder createFromParcel(Parcel source) {
return new Reminder(source);
}
@Override
public Reminder[] newArray(int size) {
return new Reminder[size];
}
};
@Override
public int describeContents() {
return 0;
}
@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeLong(_id);
dest.writeString(_message);
dest.writeString(_medication);
dest.writeString(_dosage);
dest.writeString(_date);
dest.writeString(_time);
dest.writeInt(_repeatID);
dest.writeInt(_requestCode);
}
}
我遇到的问题是,当从调用者活动传递包时,就像这样,
Bundle[{reminder=au.com.elegantmedia.vetcheck.objects.Reminder@41fade98, mode=edit}]
表示所有内容都按预期设置,但在尝试从被调用者活动(final Bundle bundle = getIntent().getExtras();
)访问附加内容时,如下所示,
Bundle[mParcelledData.dataSize=308]
然后我尝试按如下方式访问该包,
if(bundle.getString(EXTRA_MODE).equals(MODE_ADD)) {
}
else if(bundle.getString(EXTRA_MODE).equals(MODE_EDIT)) {
final Reminder reminder = getIntent().getParcelableExtra(EXTRA_REMINDER);
populateData(reminder);
}
我遇到以下异常
E/AndroidRuntime(17991): Caused by: java.lang.RuntimeException: Parcel android.os.Parcel@416ee8b0: Unmarshalling unknown type code 6357102 at offset 172
这是我对Parcelable对象的第一次尝试,所以我很少知道这意味着什么,谷歌搜索几个小时并没有完全帮助缩小问题范围。
答案 0 :(得分:24)
您的_id
类型为long
,并且您将其解组为int
类型:
_id = source.readInt();
不应该
_id = source.readLong();
我还注意到您的阅读顺序与将其写入包裹的顺序不同。编组时不会将_repeat
写入包裹。