我有一个实现了 Parcelable 的抽象类 A
。
我有一个 B
类和一个 C
类,它们都扩展了 A
。
我怎样才能使它们可打包?
因为我可以将它链接起来并在 A
和 B
中提供一个 CREATOR
,就像许多帖子中建议的那样。但是由于我有其他存储 A-B-C
类并实现 Parcelable 本身的对象,这种方法似乎不起作用,因为当我想传递 A
的 ArrayList 时,我会在类型列表中使用 CREATOR
ArrayList<A> elements = new ArrayList<>();
in.readTypedList(elements , B.CREATOR); // B.CREATOR? C.CREATOR???
这显然没有意义。那么我怎样才能正确地制作一个 Parcelable?
也就是说,我想让这个类成为 Parcelable,这样我就可以用一种通用的方式引用 A。
A)
public abstract class A implements Parcelable {
final String globalVar;
public A(String globalVar) {
this.globalVar = globalVar;
}
}
B)
public class B extends A {
String bVar;
public B(String global, String bVar) {
super(global);
this.bVar = bVar;
}
private B(Parcel in) {
super(in.readString());
this.bVar = in.readString();
}
@Override
public int describeContents() {
return 0;
}
@Override
public void writeToParcel(Parcel parcel, int i) {
parcel.writeString(bVar);
}
}
C)
public class C extends A {
String cVar;
public C(String global, String cVar) {
super(global);
this.cVar = cVar;
}
@Override
public int describeContents() {
return 0;
}
@Override
public void writeToParcel(Parcel parcel, int i) {
parcel.writeString(cVar);
}
}
最佳答案
我使用了这篇博文中 Vincent Mimoun-Prat 的可分割架构:Parcelable and inheritance in Android并遇到了关于必须指定不可能的抽象 CREATOR 的相同类型化列表问题。
在 Parcel 的 JavaDoc 中搜索我找到了方法 writeList(List val)内部使用 writeValue(Object)列表中每个对象的方法,因此从子类(A 列表中的 B 和 C)调用 writeToParcel()
。要解码列表,请使用其对应项 readList (List outVal, ClassLoader loader)其中必须传递 A ClassLoader
或抛出 android.os.BadParcelableException
,至少在我的情况下是这样。
包含 A 元素列表的类应该是这样的:
public class AContainer implements Parcelable {
//Other AContainer fields
List<A> elements = new ArrayList<>();
//Other AContainer fields
static final Parcelable.Creator<AContainer> CREATOR = new Parcelable.Creator<AContainer>() {
@Override
public AContainer createFromParcel(Parcel source) {
return new AContainer(source);
}
@Override
public AContainer[] newArray(int size) {
return new AContainer[size];
}
};
public AContainer() {
}
protected AContainer(Parcel source) {
//read other AContainer fields
source.readList(elements, A.class.getClassLoader());
//read other AContainer fields
}
@Override
public int describeContents() {
return 0;
}
@Override
public void writeToParcel(Parcel dest, int flags) {
//write other AContainer fields
dest.writeList(elements);
//write other AContainer fields
}
}
使用这些方法可能比 readTypedList()
和 writeTypedList()
慢一点,但是来自 B 和 C 子类的特定数据也被“分割”,而不仅仅是来自抽象父类(super class)的字段(不可能是抽象的)。您从 B 和 C 恢复正确的实例。
关于java - Parcelable 继承 : abstract class - Which CREATOR?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28567735/