Android readParcelable返回null

Android readParcelable返回null,android,parcelable,Android,Parcelable,我尝试将News类传递给活动,因此实现了Parcelable接口。在News内部,我有两个类也实现了Parcelable,Image和Date 问题是,我的News对象末尾包含null字段image和date 这是我的代码: News.java public class News implements Parcelable { public static final String TAG = "model_news"; private JSONObject object; private i

我尝试将
News
类传递给活动,因此实现了
Parcelable
接口。在
News
内部,我有两个类也实现了
Parcelable
Image
Date

问题是,我的
News
对象末尾包含
null
字段
image
date

这是我的代码:

News.java

public class News implements Parcelable {
public static final String TAG = "model_news";

private JSONObject object;

private int id;
private String type;
private String title;
private Boolean comment_disabled;
private String category_name;
private String url;
private Image images;
private Date date;
private Boolean is_video;

public News(JSONObject object) {
    this.object = object;

    try {
        id = Integer.parseInt(object.getString("id"));
        type = object.getString("type");
        title = object.getString("title");
        comment_disabled = object.getBoolean("comment_disabled");
        category_name = object.getString("category_name");
        url = object.getString("url");

        if (!object.isNull("images")) {
            images = new Image(object.getJSONObject("images"));
        }

        date = new Date(object.getJSONObject("date"));

        is_video = object.getBoolean("is_video");

    } catch (JSONException e) {
        Log.e(TAG, e.getMessage());
    }

}

protected News(Parcel in) {
    id = in.readInt();
    type = in.readString();
    title = in.readString();
    category_name = in.readString();
    url = in.readString();
    images =  (Image) in.readParcelable(Image.class.getClassLoader());
    date = (Date) in.readParcelable(Date.class.getClassLoader());
    is_video = in.readByte() != 0;
    comment_disabled = in.readByte() != 0;
}

public static final Creator<News> CREATOR = new Creator<News>() {
    @Override
    public News createFromParcel(Parcel in) {
        return new News(in);
    }

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

@Override
public void writeToParcel(Parcel dest, int flags) {
    dest.writeInt(id);
    dest.writeString(type);
    dest.writeString(title);
    dest.writeByte((byte) (comment_disabled ? 1 : 0));
    dest.writeString(category_name);
    dest.writeString(url);
    dest.writeParcelable(images, flags);
    dest.writeParcelable(date, flags);
    dest.writeByte((byte) (is_video ? 1 : 0));
}

@Override
public int describeContents() {
    return 0;
}
public class Image implements Parcelable {
public static final String TAG = "model_image";

private JSONObject imageObj;
private JSONObject original;

private String source;
private int width;
private Drawable image;

public Image(JSONObject imageObj) {
    this.imageObj = imageObj;

    try {
        original = this.imageObj.getJSONObject("original");
        source = original.getString("src");
        width = original.getInt("width");
    } catch (JSONException e) {
        e.getMessage();
    }
}

protected Image(Parcel in) {
    source = in.readString();
    width = in.readInt();
}

public static final Creator<Image> CREATOR = new Creator<Image>() {
    @Override
    public Image createFromParcel(Parcel in) {
        return new Image(in);
    }

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

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

@Override
public void writeToParcel(Parcel dest, int flags) {
    dest.writeString(source);
    dest.writeInt(width);
}
公共类新闻实现可包裹{
公共静态最终字符串TAG=“model\u news”;
私有JSONObject对象;
私有int-id;
私有字符串类型;
私有字符串标题;
禁用私有布尔注释;
私有字符串类别名称;
私有字符串url;
私有图像;
私人日期;
私有布尔是_视频;
公共新闻(JSONObject对象){
this.object=对象;
试一试{
id=Integer.parseInt(object.getString(“id”);
type=object.getString(“type”);
title=object.getString(“title”);
comment_disabled=object.getBoolean(“comment_disabled”);
category_name=object.getString(“category_name”);
url=object.getString(“url”);
如果(!object.isNull(“图像”)){
images=新图像(object.getJSONObject(“图像”));
}
日期=新日期(object.getJSONObject(“日期”));
is_video=object.getBoolean(“is_video”);
}捕获(JSONException e){
Log.e(标记,e.getMessage());
}
}
受保护新闻(包裹中){
id=in.readInt();
type=in.readString();
title=in.readString();
category_name=in.readString();
url=in.readString();
images=(Image)in.readParcelable(Image.class.getClassLoader());
date=.readParcelable(date.class.getClassLoader())中的(date);
is_video=in.readByte()!=0;
注释_disabled=in.readByte()!=0;
}
公共静态最终创建者=新创建者(){
@凌驾
公共新闻createFromParcel(包裹中){
返回新消息(在中);
}
@凌驾
公共新闻[]新数组(整数大小){
返回新消息[大小];
}
};
@凌驾
公共无效写入包裹(包裹目的地,内部标志){
目的地写入(id);
目的写入限制(类型);
目的书面记录(标题);
目标写入字节((字节)(注释被禁用?1:0));
目的地记录(类别名称);
目的地writeString(url);
可写入目标(图像、标志);
可写入目的地(日期、标志);
dest.writeByte((字节)(is_video?1:0));
}
@凌驾
公共int描述内容(){
返回0;
}
}

Image.java

public class News implements Parcelable {
public static final String TAG = "model_news";

private JSONObject object;

private int id;
private String type;
private String title;
private Boolean comment_disabled;
private String category_name;
private String url;
private Image images;
private Date date;
private Boolean is_video;

public News(JSONObject object) {
    this.object = object;

    try {
        id = Integer.parseInt(object.getString("id"));
        type = object.getString("type");
        title = object.getString("title");
        comment_disabled = object.getBoolean("comment_disabled");
        category_name = object.getString("category_name");
        url = object.getString("url");

        if (!object.isNull("images")) {
            images = new Image(object.getJSONObject("images"));
        }

        date = new Date(object.getJSONObject("date"));

        is_video = object.getBoolean("is_video");

    } catch (JSONException e) {
        Log.e(TAG, e.getMessage());
    }

}

protected News(Parcel in) {
    id = in.readInt();
    type = in.readString();
    title = in.readString();
    category_name = in.readString();
    url = in.readString();
    images =  (Image) in.readParcelable(Image.class.getClassLoader());
    date = (Date) in.readParcelable(Date.class.getClassLoader());
    is_video = in.readByte() != 0;
    comment_disabled = in.readByte() != 0;
}

public static final Creator<News> CREATOR = new Creator<News>() {
    @Override
    public News createFromParcel(Parcel in) {
        return new News(in);
    }

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

@Override
public void writeToParcel(Parcel dest, int flags) {
    dest.writeInt(id);
    dest.writeString(type);
    dest.writeString(title);
    dest.writeByte((byte) (comment_disabled ? 1 : 0));
    dest.writeString(category_name);
    dest.writeString(url);
    dest.writeParcelable(images, flags);
    dest.writeParcelable(date, flags);
    dest.writeByte((byte) (is_video ? 1 : 0));
}

@Override
public int describeContents() {
    return 0;
}
public class Image implements Parcelable {
public static final String TAG = "model_image";

private JSONObject imageObj;
private JSONObject original;

private String source;
private int width;
private Drawable image;

public Image(JSONObject imageObj) {
    this.imageObj = imageObj;

    try {
        original = this.imageObj.getJSONObject("original");
        source = original.getString("src");
        width = original.getInt("width");
    } catch (JSONException e) {
        e.getMessage();
    }
}

protected Image(Parcel in) {
    source = in.readString();
    width = in.readInt();
}

public static final Creator<Image> CREATOR = new Creator<Image>() {
    @Override
    public Image createFromParcel(Parcel in) {
        return new Image(in);
    }

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

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

@Override
public void writeToParcel(Parcel dest, int flags) {
    dest.writeString(source);
    dest.writeInt(width);
}
public类映像实现可包裹{
公共静态最终字符串TAG=“model\u image”;
私有JSONObject imageObj;
私有JSONObject原件;
私有字符串源;
私有整数宽度;
私有可绘制图像;
公共映像(JSONObject imageObj){
this.imageObj=imageObj;
试一试{
原始=this.imageObj.getJSONObject(“原始”);
source=original.getString(“src”);
宽度=原始.getInt(“宽度”);
}捕获(JSONException e){
e、 getMessage();
}
}
受保护的图像(包裹中){
source=in.readString();
宽度=in.readInt();
}
公共静态最终创建者=新创建者(){
@凌驾
公共图像createFromParcel(地块中){
返回新图像(在中);
}
@凌驾
公共映像[]新数组(整数大小){
返回新图像[大小];
}
};
@凌驾
公共int描述内容(){
返回0;
}
@凌驾
公共无效写入包裹(包裹目的地,内部标志){
目的写入限制(来源);
目的写入(宽度);
}
}


我做错了什么

新闻.writeToParcel
中:

dest.writeString(title);
dest.writeByte((byte) (comment_disabled ? 1 : 0));
dest.writeString(category_name);
title = in.readString();
category_name = in.readString();
News.readToParcel
中:

dest.writeString(title);
dest.writeByte((byte) (comment_disabled ? 1 : 0));
dest.writeString(category_name);
title = in.readString();
category_name = in.readString();

我想您忘记了
readByte
中的
readToParcel

包裹实现中存在错误

首先,parcelable实现声明:在News(Parcel-in)构造函数中传递的字段应在writeToParcel()方法中以相同的顺序写入。这就是所谓的编组和解编组。

更正:

  • 无法在Parcelable中传递Drawable参数

  • 新闻包裹实现

  • 错过了一些领域,这只是为了你的理解

    public class News implements Parcelable {
    
    public static final String TAG = "model_news";
    
        private JSONObject object;
    
        private int id;
        private String type;
        private String title;
        private Boolean comment_disabled;
        private String category_name;
        private String url;
        private Image images;
        private Date date;
        private Boolean is_video;
    
        protected News(Parcel in) {
            id = in.readInt();
            type = in.readString();
            title = in.readString();
            category_name = in.readString();
            url = in.readString();
        }
    
        public static final Creator<News> CREATOR = new Creator<News>() {
            @Override
            public News createFromParcel(Parcel in) {
                return new News(in);
            }
    
            @Override
            public News[] newArray(int size) {
                return new News[size];
            }
        };
    
        @Override
        public int describeContents() {
            return 0;
        }
    
        @Override
        public void writeToParcel(Parcel dest, int flags) {
            dest.writeInt(id);
            dest.writeString(type);
            dest.writeString(title);
            dest.writeString(category_name);
            dest.writeString(url);
        }
    }
    
    
    
    
    
    
    public class Image implements Parcelable {
        public static final String TAG = "model_image";
    
    private JSONObject imageObj;
    private JSONObject original;
    
    private String source;
    private int width;
    private Drawable image;
    
    protected Image(Parcel in) {
        source = in.readString();
        width = in.readInt();
    }
    
    public static final Creator<Image> CREATOR = new Creator<Image>() {
        @Override
        public Image createFromParcel(Parcel in) {
            return new Image(in);
        }
    
        @Override
        public Image[] newArray(int size) {
            return new Image[size];
        }
    };
    
    @Override
    public int describeContents() {
        return 0;
    }
    
    @Override
    public void writeToParcel(Parcel dest, int flags) {
        dest.writeString(source);
        dest.writeInt(width);
    }
    }
    
    公共类新闻实现可包裹{
    公共静态最终字符串TAG=“model\u news”;
    私有JSONObject对象;
    私有int-id;
    私有字符串类型;
    私有字符串标题;
    禁用私有布尔注释;
    私有字符串类别名称;
    私有字符串url;
    私有图像;
    私人日期;
    私有布尔是_视频;
    受保护新闻(包裹中){
    id=in.readInt();
    type=in.readString();
    title=in.readString();
    category_name=in.readString();
    url=in.readString();
    }
    公共静态最终创建者=新创建者(){
    @凌驾
    公共新闻createFromParcel(包裹中){
    返回新消息(在中);
    }
    @凌驾
    公共新闻[]新数组(整数大小){
    返回新消息[大小];
    }
    };
    @凌驾
    公共int描述内容(){
    返回0;
    }
    @凌驾
    公共无效写入包裹(包裹目的地,内部标志){
    目的地写入(id);
    目的写入限制(类型);
    目的书面记录(标题);
    目的地记录(类别名称);
    目的地writeString(url);
    }
    }
    公共类映像实现了Parcelable{
    公共静态最终字符串TAG=“model\u image”;
    私有JSONObject imageObj;
    私有JSONObject原件;
    私有字符串源;
    私有整数宽度;
    私有可绘制图像;
    受保护的图像(包裹中){
    source=in.readString();
    宽度=in.readInt();
    }
    公共静态最终创建者=新创建者(){
    @凌驾
    公共图像createFromParcel(地块中){
    返回新图像(在中);
    }
    @凌驾
    公众的