扩展实现Parcelable的类

时间:2012-05-31 21:19:28

标签: android parcelable

我有一个类,我们称之为A类,它实现了Parcelable。

我有第二个课程,我们称之为B课,它扩展了A类。

我的问题是:

如何将B类成员变量写入Parcel,然后将其父类(即:A类)成员变量写入Parcel(并随后将其读入)?

是否有一些不需要重写A类包裹代码的好玩法?或者我只需要在A类中重写Parcel代码并为B类成员变量添加额外的代码?

3 个答案:

答案 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);
    }

}

标记的答案提供了一个非常好的解释,称超级是关键。