无法读取另一个可打包对象中的可打包对象
Unable to read a parcelable object within another parcelable object
我有一个 Prescription
的 class,其中包含 Medication
、Doctor
和 Pharmacy
的字段。每个 classes 都实现 Parcelable
以便它们可以在 Bundle
.
内部传递
Medication、Doctor 和 Pharmacy,我没有任何问题。然而,对于 Pharmacy 来说,事情变得有点棘手,因为它的字段是对象,也实现了 parcelable。为了编写该对象,我使用了从 question:
中获得的以下代码
/**
* Bundles all the fields of a pharmacy object to be passed in a `Bundle`.
* @param dest The parcel that will hold the information.
* @param flags Any necessary flags for the parcel.
*/
@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeParcelable(getMedication(), 0);
dest.writeParcelable(getDoctor(), 0);
dest.writeParcelable(getPharmacy(), 0);
dest.writeInt(getQuantity());
dest.writeSerializable(getStartDate());
dest.writeString(getNotes());
dest.writeString(getInstructions());
}
而读方的Creator
是这样写的:
public static final Creator<Prescription> CREATOR = new Creator<Prescription>() {
@Override
public Prescription createFromParcel(Parcel source) {
return new Prescription(
source.readLong(), // Id
(Medication) source.readParcelable(Medication.class.getClassLoader()), // Medication
(Doctor) source.readParcelable(Doctor.class.getClassLoader()), // Doctor
(Pharmacy) source.readParcelable(Pharmacy.class.getClassLoader()), // Pharmacy
source.readInt(), // Quantity
(Date) source.readSerializable(), // Start Date
source.readString(), // Notes
source.readString() // Instructions
);
}
@Override
public Prescription[] newArray(int size) {
return new Prescription[size];
}
};
当我尝试从一个 Bundle 中读取一个 Prescription 对象时,它 returns 一个具有 Med/Doctor/Pharm 空值的 Prescription 对象,并且确实模糊了 Id 和 Quantity 值。我不知道为什么。什么会导致这些值为空?
实现如下:
// Inside the NewPrescriptionActivity
Intent data = new Intent();
data.putExtra(PrescriptionBinderActivity.ARG_PRESCRIPTION, prescription);
setResult(RESULT_OK, data);
// Inside the Activity that calls it.
if(requestCode == ADD_SCRIPT_REQUEST && resultCode == RESULT_OK){
Prescription p = data.getParcelableExtra(ARG_PRESCRIPTION);
mAdapter.addPrescription(p);
}else{
super.onActivityResult(requestCode, resultCode, data);
}
同样,我在其他 class 上使用了相同的方法,没有任何问题,但这不适用于 Prescription
。我怀疑是因为它有 Parcelable 字段。
您没有将 id 字段添加到包裹中。
修改 writeToParcel() 方法的第一行并添加:
dest.writeLong(getId());
因此,整个阅读都是错误的。
我有一个 Prescription
的 class,其中包含 Medication
、Doctor
和 Pharmacy
的字段。每个 classes 都实现 Parcelable
以便它们可以在 Bundle
.
Medication、Doctor 和 Pharmacy,我没有任何问题。然而,对于 Pharmacy 来说,事情变得有点棘手,因为它的字段是对象,也实现了 parcelable。为了编写该对象,我使用了从 question:
中获得的以下代码/**
* Bundles all the fields of a pharmacy object to be passed in a `Bundle`.
* @param dest The parcel that will hold the information.
* @param flags Any necessary flags for the parcel.
*/
@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeParcelable(getMedication(), 0);
dest.writeParcelable(getDoctor(), 0);
dest.writeParcelable(getPharmacy(), 0);
dest.writeInt(getQuantity());
dest.writeSerializable(getStartDate());
dest.writeString(getNotes());
dest.writeString(getInstructions());
}
而读方的Creator
是这样写的:
public static final Creator<Prescription> CREATOR = new Creator<Prescription>() {
@Override
public Prescription createFromParcel(Parcel source) {
return new Prescription(
source.readLong(), // Id
(Medication) source.readParcelable(Medication.class.getClassLoader()), // Medication
(Doctor) source.readParcelable(Doctor.class.getClassLoader()), // Doctor
(Pharmacy) source.readParcelable(Pharmacy.class.getClassLoader()), // Pharmacy
source.readInt(), // Quantity
(Date) source.readSerializable(), // Start Date
source.readString(), // Notes
source.readString() // Instructions
);
}
@Override
public Prescription[] newArray(int size) {
return new Prescription[size];
}
};
当我尝试从一个 Bundle 中读取一个 Prescription 对象时,它 returns 一个具有 Med/Doctor/Pharm 空值的 Prescription 对象,并且确实模糊了 Id 和 Quantity 值。我不知道为什么。什么会导致这些值为空?
实现如下:
// Inside the NewPrescriptionActivity
Intent data = new Intent();
data.putExtra(PrescriptionBinderActivity.ARG_PRESCRIPTION, prescription);
setResult(RESULT_OK, data);
// Inside the Activity that calls it.
if(requestCode == ADD_SCRIPT_REQUEST && resultCode == RESULT_OK){
Prescription p = data.getParcelableExtra(ARG_PRESCRIPTION);
mAdapter.addPrescription(p);
}else{
super.onActivityResult(requestCode, resultCode, data);
}
同样,我在其他 class 上使用了相同的方法,没有任何问题,但这不适用于 Prescription
。我怀疑是因为它有 Parcelable 字段。
您没有将 id 字段添加到包裹中。
修改 writeToParcel() 方法的第一行并添加:
dest.writeLong(getId());
因此,整个阅读都是错误的。