java - Parcelable 继承 : abstract class - Which CREATOR?

标签 java android inheritance parcelable

我有一个实现了 Parcelable 的抽象类 A

我有一个 B 类和一个 C 类,它们都扩展了 A。 我怎样才能使它们可打包?

因为我可以将它链接起来并在 AB 中提供一个 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/

相关文章:

android - 如何从 Android 应用程序编写 android 二进制 XML?

c++ - 编写不区分大小写的字符串类

c++ - 重载运算符+

java - GridBagLayout 锚定不起作用,始终显示在 JPanel 的中心

java - Android BackupManager 在卸载或其他设备后无法恢复?

android - 如何将 iPhone 添加到 Android Studio?

c++ - 无法访问继承的变量

java - 由已分配的 ByteString 支持的高效 okio 源?

Java泛型使用extends捕获通配符

java - 如何使用 java spring 制作 encodeURI/decodeURI?