我有一个类,我们称之为 A 类,它实现了 Parcelable。
我有第二个类,我们称之为 B 类,它扩展了 A 类。
我的问题是:
如何将 B 类的成员变量写入 Parcel,然后将其父类(即:A 类)的成员变量写入 Parcel(并随后将它们读入)?
不需要重写 A 类的包裹代码有什么妙招吗?还是我只需要重写 A 类中的 Parcel 代码并为 B 类的成员变量添加额外的代码?
我有一个类,我们称之为 A 类,它实现了 Parcelable。
我有第二个类,我们称之为 B 类,它扩展了 A 类。
我的问题是:
如何将 B 类的成员变量写入 Parcel,然后将其父类(即:A 类)的成员变量写入 Parcel(并随后将它们读入)?
不需要重写 A 类的包裹代码有什么妙招吗?还是我只需要重写 A 类中的 Parcel 代码并为 B 类的成员变量添加额外的代码?
如何将 B 类的成员变量写入 Parcel,然后将其父类(即:A 类)的成员变量写入 Parcel
BwriteToParcel()
类从 A 类覆盖,链接到超类,并将其自己的对象添加到Parcel
.
(并随后读入)?
B 类public static final Parcelable.Creator<MyParcelable> CREATOR
以这样一种方式实现,它可以让两个类都读取它们的内容。如果您采用在 B 类上创建一个以 aParcel
作为构造函数参数的构造函数的方法,只需链接到超类构造函数(让 A 类执行它的工作),然后读取 B 类的数据。
关键是要以相同的顺序执行它们。如果您打算让 A 类先读取其数据,则 A 类必须先写入其数据。
不需要重写 A 类的包裹代码有什么妙招吗?
继承和链接到超类。
添加一个例子,标记的答案确实是正确的,但是更直观的东西似乎更适合这种情况:
这将是晚餐课程:
public class BasePojo implements Parcelable {
private String something;
//what ever other constructor
//getters and setters
protected BasePojo(Parcel in) {
something = in.readString();
}
public static final Creator<BasePojo> CREATOR = new Creator<BasePojo>() {
@Override
public BasePojo createFromParcel(Parcel in) {
return new BasePojo(in);
}
@Override
public BasePojo[] newArray(int size) {
return new BasePojo[size];
}
};
@Override
public int describeContents() {
return 0;
}
@Override
public void writeToParcel(Parcel parcel, int i) {
parcel.writeString(something);
}
}
然后这将是子类:
public class ChildPojo extends BasePojo implements Parcelable {
private int somethingElse;
//what ever other constructor
//getters and setters
protected ChildPojo(Parcel in) {
super(in);
somethingElse = in.readInt();
}
public static final Creator<ChildPojo> CREATOR = new Creator<ChildPojo>() {
@Override
public ChildPojo createFromParcel(Parcel in) {
return new ChildPojo(in);
}
@Override
public ChildPojo[] newArray(int size) {
return new ChildPojo[size];
}
};
@Override
public int describeContents() {
return 0;
}
@Override
public void writeToParcel(Parcel parcel, int i) {
super.writeToParcel(parcel, i);
parcel.writeInt(somethingElse);
}
}
标记的答案提供了一个很好的解释,调用 super 是关键。
这有点复杂,但诀窍是使用反射来获取子类成员的类型并对成员进行排序,以便您可以使用正确的类型以相同的确切顺序读取和写入数据。
我在这里实现了 A 类的解决方案:https ://github.com/awadalaa/Android-Global-Parcelable
所以现在你可以通过简单地扩展这个类来使任何类可打包。