2013-04-24 26 views
2

我试图启动一个新的Activity并向Intent添加一个自定义的Parcelable对象。 显然,这不工作:我在这个Parcelable课上做错了什么?

类:

public class TestObject implements Parcelable{ 

private String mString; 
private int mInt; 
private List<String> mList; 



public TestObject() { 
    this.mString = "This is a String"; 
    this.mInt = 777; 
    mList = new ArrayList<String>(); 
    for(int i=0; i<100; i++){ 
     mList.add(String.valueOf(i)); 
    } 
} 




public TestObject(Parcel in) { 
    setmInt(in.readInt()); 
    setmString(in.readString()); 
    mList = new ArrayList<String>(); 
    in.readStringList(mList); 

} 


public void setmString(String mString) { 
    this.mString = mString; 
} 



public void setmInt(int mInt) { 
    this.mInt = mInt; 
} 


public String getmString() { 
    return mString; 
} 




public int getmInt() { 
    return mInt; 
} 


@Override 
public int describeContents() { 
    // TODO Auto-generated method stub 
    return 0; 
} 






@Override 
public void writeToParcel(Parcel dest, int flags) { 
    dest.writeString(mString); 
    dest.writeInt(mInt); 
    dest.writeStringList(mList); 

} 

public static final Parcelable.Creator CREATOR = new Parcelable.Creator() { 
    public TestObject createFromParcel(Parcel in) { 
     return new TestObject(in); 
    } 

    public TestObject[] newArray(int size) { 
     return new TestObject[size]; 
    } 
}; 

}

FirstActivity:

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    TestObject object = new TestObject(); 
    Intent i = new Intent(this, SecondActivity.class); 
    Debug.startMethodTracing("parcelable"); 
    i.putExtra("object", object); 
    startActivity(i); 
} 

次活动:

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    Intent i = getIntent(); 
    TestObject ob = (TestObject) i.getParcelableExtra("object"); 
    Debug.stopMethodTracing(); 
    Log.d("object string", "string: " + ob.getmString()); 

} 

问题在于List<String> ...

回答

4

问题是,您以不同的顺序将变量写入到包中。你先写mString,但先读mInt。这将工作:

@Override 
public void writeToParcel(Parcel dest, int flags) { 
    dest.writeString(mString); 
    dest.writeInt(mInt); 
    dest.writeStringList(mList); 
} 

public TestObject(Parcel in) { 
    setmString(in.readString()); 
    setmInt(in.readInt()); 
    mList = new ArrayList<String>(); 
    in.readStringList(mList); 
} 

而且顺便说一句不使用对CREATOR原始类型,而不是使用:

public static final Parcelable.Creator<TestObject> CREATOR = new Parcelable.Creator<TestObject>() { 
     public TestObject createFromParcel(Parcel in) { 
      return new TestObject(in); 
     } 

     public TestObject[] newArray(int size) { 
      return new TestObject[size]; 
     } 
    };