我有一个类,我们称之为A类,它实现了Parcelable。
我有第二个课程,我们称之为B课,它扩展了A类。
我的问题是:
如何将B类成员变量写入Parcel,然后将其父类(即:A类)成员变量写入Parcel(并随后将其读入)?
是否有一些不需要重写A类包裹代码的好玩法?或者我只需要在A类中重写Parcel代码并为B类成员变量添加额外的代码?
答案 0 :(得分:20)
如何将B类成员变量写入Parcel,然后将其父类(即:A类)成员变量写入Parcel
B类覆盖A类中的writeToParcel()
,链接到超类,并将自己的对象添加到Parcel
。
(然后,阅读它们)?
B类以这样一种方式实现public static final Parcelable.Creator<MyParcelable> CREATOR
,它可以让两个类读取它们的内容。如果你采用在类B上创建构造函数的方法,它将Parcel
作为构造函数参数,只是链接到超类构造函数(让A类完成它的工作),然后读取B类的数据。
关键是以相同的顺序完成它们。如果您打算让A类首先读取其数据,则A类必须首先写入其数据。
是否有一些不需要重写A类包裹代码的巧妙技巧?
继承并链接到超类。
答案 1 :(得分:1)
这有点复杂,但诀窍是使用Reflection来获取子类成员的类型并对成员进行排序,以便您可以使用适当的顺序以相同的顺序读取和写入数据类型。
我在这里实施了A类解决方案:https://github.com/awadalaa/Android-Global-Parcelable
所以现在你可以通过简单地扩展这个类来使任何类可以使用。
答案 2 :(得分:0)
添加一个例子,标记的答案确实是正确的,但更直观的东西似乎更适合这种情况:
这将是晚餐课程:
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);
}
}
标记的答案提供了一个非常好的解释,称超级是关键。