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()方法中以相同的顺序写入。这就是所谓的编组和解编组。
更正:
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(地块中){
返回新图像(在中);
}
@凌驾
公众的