2016-05-18 14 views
1

我嘗試將News類傳遞給一個活動,所以我實現了Parcelable接口。裏面News我有兩個類實現ParcelableImageDatereadParcelable返回null

的問題是,在結束我的News對象包含null的領域imagedate

這裏我的代碼:

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; 
} 

}

Image.java

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); 
} 

}

我做錯了什麼?

+0

既不繪製對象,也不是日期parcelable – Blackbelt

+0

'Date'不'Util.Date',這是一個個人類實現'parcelable' – Lilrom

+0

,我怎麼知道? – Blackbelt

回答

2

Parcelable實現中存在錯誤。

首先可以實現的可執行狀態:在News(Parcel in)中傳遞的字段應該使用writeToParcel()方法以相同的順序寫入構造方法。這就是所謂的編組和解組。

更正:

  1. 繪製對象不能在Parcelable傳遞的參數。

  2. 新聞Parcelable implementation。

錯過了一些只是爲了您的理解的領域。

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); 
} 
} 
1

News.writeToParcel

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

News.readToParcel

title = in.readString(); 
category_name = in.readString(); 

我想你在readToParcel忘了readByte

+0

mmh沒有我閱讀我所有的領域 – Lilrom

+0

他們必須準確讀取他們寫的順序相同。 –

+0

哦對不起我的壞,好吧我正在糾正 – Lilrom