我有一個Parcelable包含另一個Parcelable,都有一個id。對於包含的Parcelable,我編寫了id 22,但它顯示爲20.爲什麼?Parcelable包含其他Parcelable不寫/讀正確的值
我構成一個完整的例子
Parcelable1
public class Parcelable1 implements Parcelable {
public int id = 11;
public Parcelable2 parcelable2;
public Parcelable1() {
parcelable2 = new Parcelable2(22);
}
@Override
public int describeContents() {
return hashCode();
}
@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeInt(id);
dest.writeParcelable(parcelable2, flags);
}
public static final Creator<Parcelable1> CREATOR = new Parcelable.Creator<Parcelable1>() {
public Parcelable1 createFromParcel(Parcel source) {
return new Parcelable1(source);
}
public Parcelable1[] newArray(int size) {
return new Parcelable1[size];
}
};
public Parcelable1(Parcel source) {
id = source.readInt();
parcelable2 = Parcelable2.CREATOR.createFromParcel(source);
}
}
Parcelable2
public class Parcelable2 implements Parcelable {
public int id = 22;
public Parcelable2(int id) {
this.id = id;
}
@Override
public int describeContents() {
return hashCode();
}
@Override
public void writeToParcel(Parcel dest, int flags) {
Log.d("test", "WRITE Parcelable2 id:" + id);
dest.writeInt(id);
}
public static final Creator<Parcelable2> CREATOR = new Parcelable.Creator<Parcelable2>() {
public Parcelable2 createFromParcel(Parcel source) {
return new Parcelable2(source);
}
public Parcelable2[] newArray(int size) {
return new Parcelable2[size];
}
};
public Parcelable2(Parcel source) {
id = source.readInt();
Log.d("test", "READ Parcelable2 id:" + id);
}
}
活性,其經過Parselable:
public class ParcelableTestActivity1 extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
findViewById(R.id.btn).setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
Intent i = new Intent(ParcelableTestActivity1.this, ParcelableTestActivity2.class);
i.putExtra("par", new Parcelable1());
startActivity(i);
}
});
}
}
接收活動:
個public class ParcelableTestActivity2 extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main2);
Parcelable1 p = (Parcelable1)getIntent().getParcelableExtra("par");
Log.d("test", "parcelable 1 is: " + p + "id: " + p.id + " p2: " + p.parcelable2 + " p2.id: " + p.parcelable2.id);
Toast.makeText(this, "parc1 id: " + p.id + " parc2 id: " + p.parcelable2.id, Toast.LENGTH_LONG).show();
}
}
輸出:
06-25 17:45:29.440:d /測試(4107):READ Parcelable2 ID:0
06-25 17:45:29.440: D/test(4107):parcelable 1 is:[email protected]:11 p2:[email protected] p2.id:0
06-25 17:47:19.968:D/test (4247):WRITE Parcelable2 id:22
06-25 17:47:19.988 D/test(4247):READ Parcelable2 id:20
06-25 17:47:19.988:D/test(4247):parcelable 1 is:com.test。 Parcelable1 @ 4052e238id:11 P2:[email protected] p2.id:20
Omg,我愛你!我花了幾個小時...從一些例子中複製它,並沒有認爲*那將是錯誤。但我不明白你的解釋,預計22,但我得到20。我想這只是一些亂七八糟的價值......無論如何接受和+1。 – Ixx
當您將「source」傳遞給Parcelable2的構造函數時,它將從Parcelable1中讀取id(因爲該parcel對應於應該用於創建Parcelable1的數據)。樂意效勞。 – theelfismike
但是Parcelable1的id是11.可能是Parcelable2的地址或值的一部分,它將成爲下一個要讀取的元素。 – Ixx