android - 嵌套的可包裹对象未读取

标签 android parcelable

我正在尝试打包一个包含一些字符串/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();
    }

}

最佳答案

我通过更改从包裹中写入/读取的顺序解决了这个问题。我将 dest.writeParcelable(otherClass, flags);otherClass = (OtherClass) in.readParcelable(OtherClass.class.getClassLoader()); 调用设为首先是他们的方法,它开始起作用。这是个问题吗?

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

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

关于android - 嵌套的可包裹对象未读取,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15745223/

相关文章:

java - 编写 Parcelable 时出现 StackOverflowError

java - 从 Firebase 获取 Parcelable

android - 安卓编码标准

java - 在本地发送有序广播(在我的流程中)?

java - 我的服务没有启动

android - ArrayList 不能转换为 Parcelable

android - 如何用 Any 类型打包值(value)?使用@Parcelize

android - Parcelable readString() 可为空警告

java - Xamarin Android Theme.AppCompat 异常

java - 如何按照 API 调用完成的顺序在 RecyclerView 中加载项目?