14

Parcelable を実装するクラスをクラス A と呼びます。

クラス A を拡張した 2 つ目のクラス (クラス B と呼びます) があります。

私の質問は:

クラス B のメンバー変数をパーセルに書き込み、その親クラス (つまり、クラス A) のメンバー変数をパーセルに書き込む (そして、それらを読み込む) にはどうすればよいですか?

クラス A のパーセル コードを書き直す必要がないようにするためのちょっとしたコツはありますか? それとも、クラス A のパーセル コードを書き直して、クラス B のメンバー変数のコードを追加するだけでよいのでしょうか?

4

3 に答える 3

22

クラスBのメンバー変数をパーセルに書き込んでから、その親クラス(つまり、クラスA)のメンバー変数をパーセルに書き込むにはどうすればよいですか。

クラスBはクラスAからオーバーライドwriteToParcel()し、スーパークラスにチェーンし、独自のオブジェクトをに追加しますParcel

(そして、その後、それらを読んでください)?

クラスBpublic static final Parcelable.Creator<MyParcelable> CREATORは、両方のクラスにデータを読み込ませるように実装します。Parcelコンストラクターパラメーターとしてを使用するクラスBでコンストラクターを作成するアプローチをとる場合は、スーパークラスコンストラクターにチェーンするだけです(クラスAにその作業)、次にクラスBのデータを読み取ります。

重要なのは、両方を同じ順序で実行することです。クラスAに最初にデータを読み取らせる場合は、クラスAに最初にデータを書き込む必要があります。

クラスAのパーセルコードを書き直す必要がないという気の利いたトリックはありますか?

スーパークラスへの継承と連鎖。

于 2012-05-31T21:24:33.097 に答える
4

例を追加すると、マークされた答えは確かに正しいですが、この状況にはより視覚的なものがより適しているようです:

これは夕食のクラスになります:

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

}

マークされた答えは非常に良い説明を提供します。スーパーを呼び出すことが重要です。

于 2018-02-22T17:55:09.330 に答える