2012-06-25 39 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()); 

我已经测试了您的代码,并且对该行的修改会读取正确的值。