27

string/int 変数とオブジェクト変数を含むオブジェクトを分割しようとしています。文字列と int は機能していますが、ネストされたオブジェクトは機能していません。小包化も可能にする必要があることは理解していますが、どうやら何か間違ったことをしているようです=。ネストされたクラスでは、writeToParcelメソッドが呼び出されます (Log.d()呼び出しで確認します) が、メソッドは呼び出されcreateFromParcel()ません。私はオブジェクトを取得することになりnullます。これは私の簡略化されたコードです:

public class MyClass implements Parcelable {

    public MyClass() {
    }

    private Integer id;
    private String name;    
    private MyOtherClass otherClass = new MyOtherClass();

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public OtherClass getOtherClass() {
        return otherClass;
    }

    public void setOtherClass(OtherClass otherClass) {
        this.otherClass = otherClass;
    }

    public static final Parcelable.Creator<MyClass> CREATOR
            = new Parcelable.Creator<MyClass>() {
        public MyClass createFromParcel(Parcel in) {
            return new MyClass(in);
        }

        public MyClass[] newArray(int size) {
            return new MyClass[size];
        }
    };

    @Override
    public int describeContents() {
        // TODO Auto-generated method stub
        return 0;
    }

    @Override
    public void writeToParcel(Parcel dest, int flags) {
        dest.writeString(name);
        dest.writeInt(id);
        dest.writeParcelable(otherClass, flags);
    }

    private MyClass(Parcel in) {
        name = in.readString();
        id = in.readInt();
        otherClass = (OtherClass) in.readParcelable(OtherClass.class.getClassLoader());
    }
}

class MyOtherClass implements Parcelable {

    public OtherClass() {
    }

    private String resourcePreviewURL;

    public String getResourcePreviewURL() {
        return resourcePreviewURL;
    }

    public void setResourcePreviewURL(String resourcePreviewURL) {
        this.resourcePreviewURL = resourcePreviewURL;
    }

    public int describeContents() {
        return 0;
    }

    public void writeToParcel(Parcel out, int flags) {
        Log.d("parcel", "write to parcel"); // this gets called
        out.writeString(resourcePreviewURL);
    }

    public static final Parcelable.Creator<MyOtherClass> CREATOR
            = new Parcelable.Creator<MyOtherClass>() {
        public MyOtherClass createFromParcel(Parcel in) {
            Log.d("parcel", "create from parcel"); // this doesn't get called
            return new MyOtherClass(in);
        }

        public ResourcePreviews[] newArray(int size) {
            return new ResourcePreviews[size];
        }
    };

    private OtherClass(Parcel in) {
            Log.d("parcel", "read from parcel"); // this doesn't get called
        resourcePreviewURL = in.readString();
    }

}
4

1 に答える 1