2013-04-01 51 views
19

我想包裹一個包含一些字符串/ int變量和對象變量的對象。字符串和int正在工作,但不是嵌套對象。我明白,我不得不這樣做也可以parcelable,但我顯然做錯了=。在我的嵌套類中,writeToParcel方法被調用(我使用Log.d()調用進行檢查),但createFromParcel()沒有。我最終得到了一個null對象。這是我的簡化代碼:嵌套的parcelable對象不能讀取

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

} 

回答

60

我解決了這個問題,通過改變我從Parcel寫/讀的順序。我使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(); 
} 
+0

找不到你.. –

+0

@MohitSharma,我只是改變了我讀/寫的順序。 'OtherClass'應該是第一個被讀/寫到'Parcel' – iomartin

+3

爲什麼訂單很重要? – Zyoo