2012-06-25 37 views
2

我有一個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

回答

4
parcelable2 = Parcelable2.CREATOR.createFromParcel(source); 

那是你的問題。

來源:

  • Parcelable2

當你通源到構造函數用於Parcelable 2,22被設置爲parcelable2的ID。

你需要這樣做:

id = source.readInt(); 
parcelable2 = source.readParcelable(Parcelable2.class.getClassLoader()) 
+0

Omg,我愛你!我花了幾個小時...從一些例子中複製它,並沒有認爲*那將是錯誤。但我不明白你的解釋,預計22,但我得到20。我想這只是一些亂七八糟的價值......無論如何接受和+1。 – Ixx

+0

當您將「source」傳遞給Parcelable2的構造函數時,它將從Parcelable1中讀取id(因爲該parcel對應於應該用於創建Parcelable1的數據)。樂意效勞。 – theelfismike

+0

但是Parcelable1的id是11.可能是Parcelable2的地址或值的一部分,它將成爲下一個要讀取的元素。 – Ixx

3

,你出了問題的地方是這樣的:

parcelable2 = Parcelable2.CREATOR.createFromParcel(source); 

應改成這樣:

parcelable2 = source.readParcelable(Parcelable2.class.getClassLoader()); 

我已經測試了您的代碼,並且對該行的修改會讀取正確的值。