【问题标题】:Make a custom java object Parcelable in Android在Android中制作自定义java对象Parcelable
【发布时间】:2011-09-26 18:03:14
【问题描述】:

我正在尝试通过意图将MyCustomObject 类型的对象发送到另一个活动。我知道,要使类 Parcelable,我应该做public class MyCustomObject implements Parcelable,但我不确定自定义对象数组如何在 Parcelable 中工作。这是我到目前为止所得到的......另外,我是否需要让 Search 类也实现 Parcelable ?

这是我的更新答案我现在在执行intent.getParcelableExtra(search) 时得到一个空对象。也许我没有正确创建搜索数组?

public class MyCustomObject implements Parcelable{
    public Search search[];

    public MyCustomObject(Parcel in){
        in.readArray(MyCustomObject.class.getClassLoader());
    }

    @Override
    public int describeContents(){
        return 0;
    }

    @Override
    public void writeToParcel(Parcel dest, int flags){
        dest.writeArray(search)
    }

    public static final Parcelable.Creator<MyCustomObject> CREATOR = new Parcelable.Creator<MyCustomObject>(){
        @Override
        public MyCustomObject createFromParcel(Parcel source){
            return new MyCustomObject(source);
        }

        @Override
        public MyCustomObject[] newArray(int size){
            return new MyCustomObject[size];
        }
    }

    public static class Search implements Parcelable{
        public int rank;
        public String title;
        public String[] imageURL;

        public Search(Parcel in){
            rank = in.readInt();
            title = in.readString();

            String[] url = new String[4];
            in.readStringArray(url);
            url = imageURL
        }

        @Override
        public int describeContents(){
            return 0;
        }

        @Override
        public void writeToParcel(Parcel dest, int flags){
            dest.writeInt(rank);
            dest.writeString(title);
            dest.writeStringArray(imageURL);
        }

        public static final Parcelable.Creator<Search> CREATOR = new Parcelable.Creator<Search>(){

        @Override
        public Search createFromParcel(Parcel source){
            return new Search(source);
        }

        @Override
        public Search[] newArray(int size){
            return new Search[size];
        }
    }

    }
}

【问题讨论】:

    标签: android parcelable parcel


    【解决方案1】:

    有几件事。首先,您的 Search 对象也需要实现 Parcelable。接下来,您需要创建一个名为 CREATOR 的静态字段,该字段实现 Parcelable.Creator。这将有一个名为 createFromParcel 的方法,该方法返回 MyCustomObject 的一个实例。这是您从包裹中读取数据并创建 MyCustomObject 的新实例的地方。这与 writeToParcel 本质上是相反的。这一切也适用于搜索,因为您必须使其实现 Parcelable。总结:

    • 使搜索实现 Parcelable
    • 实现 Search.writeToParcel
    • 在 Search 中创建一个名为 CREATOR 的静态字段,该字段实现 Parcelable.Creator
    • 实现Search.CREATOR的createFromParcel方法
    • 在 MyCustomObject 中创建一个名为 CREATOR 的静态字段,该字段实现 Parcelable.Creator
    • 实现MyCustomObject.CREATOR的createFromParcel方法

    【讨论】:

    • 感谢您的指导。我已经按照你说的做了......但我在 in.readStringArray(imageURL); 处得到了 nullpointerexception;我想这不是我想读取字符串数组的方式。你能快点看看我的回答吗?
    • 我已经解决了上述问题;现在,当我执行 intent.getParcelableExtra(搜索)时,我得到一个空对象。有什么想法吗?
    • 不确定“搜索”是什么。我假设它是一个字符串,并且您使用它在用于启动 Activity 的 Intent 上放置了 Extra。尝试在将 MyCustomObject 放入 Parcel 后添加断点进行调试,然后在从 Intent 中读取它时再次在下一个 Activity 中进行调试。
    【解决方案2】:

    当你从 Parcel 中读取数组时,你想读取一个 Search[] 数组。不是 MyCustomObject。

        public MyCustomObject(Parcel in){
           in.readArray(MyCustomObject.class.getClassLoader());
        }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-11-03
      • 1970-01-01
      • 2023-03-29
      • 1970-01-01
      • 2021-07-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多