我有一个类,我们把它叫做A级,实现Parcelable。
我有一个第二类,我们把它叫做B类,扩展类A.
我的问题是:
我怎样写的B类的成员变量的包裹,然后写它的父类的(即:A类的)成员变量的包裹(以及随后的阅读中)?
有一些漂亮的技巧,不需要重写类A的包裹代码? 还是我只需要重写类A的包裹代码,并添加额外的代码B类的成员变量?
我有一个类,我们把它叫做A级,实现Parcelable。
我有一个第二类,我们把它叫做B类,扩展类A.
我的问题是:
我怎样写的B类的成员变量的包裹,然后写它的父类的(即:A类的)成员变量的包裹(以及随后的阅读中)?
有一些漂亮的技巧,不需要重写类A的包裹代码? 还是我只需要重写类A的包裹代码,并添加额外的代码B类的成员变量?
我怎样写的B类的成员变量的包裹,然后写它的父类的(即:A类的)成员变量的包裹
B类覆盖writeToParcel()
从A类,链接到父类并且还加入其自己的对象的Parcel
。
(以及随后的阅读中)?
B类实现public static final Parcelable.Creator<MyParcelable> CREATOR
以这样一种方式,它可以让两个班念他们的东西。如果你把创建B类的构造函数,需要一个的方法Parcel
作为一个构造函数参数,只链超类构造函数(让A类做它的工作),然后阅读B类的数据。
关键是做他们两个以相同的顺序。 如果你打算让A类读取其数据第一,类必须先写它的数据。
有一些漂亮的技巧,不需要重写类A的包裹代码?
继承和链接到超类。
这是一个有点复杂,但诀窍是使用反射来获取类型的子类的成员和成员排序,以便您可以读取和写入数据回使用了正确的类型相同的确切顺序。
我已经实现了A级的解决方案在这里: https://github.com/awadalaa/Android-Global-Parcelable
所以现在你可以通过简单的扩展此类做出任何类parcelable。
添加一个例子,标志着答案确实是正确的,但更多的东西看起来视觉更加适合这样的情况:
这将是晚饭类:
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);
}
}
该标记的答案提供了一个很好的解释,称超是关键。