Android 其他包裹不包含的包裹';t写入/读取正确的值

Android 其他包裹不包含的包裹';t写入/读取正确的值,android,parcelable,Android,Parcelable,我有一个包含另一个包裹的包裹,两个都有id。对于包含的包裹,我写id 22,但它读20。为什么? 我构建了一个完整的示例 包裹1 public class Parcelable1 implements Parcelable { public int id = 11; public Parcelable2 parcelable2; public Parcelable1() { parcelable2 = new Parcelable2(22); } @Override public i

我有一个包含另一个包裹的包裹,两个都有id。对于包含的包裹,我写id 22,但它读20。为什么?

我构建了一个完整的示例

包裹1

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);
}
}
接收活动:

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):读取包裹2 id:0

06-25 17:45:29.440:D/测试(4107):包裹1是:com.test。Parcelable1@4052e430id:11 p2:com.test。Parcelable2@4052e6e0p2.id:0

06-25 17:47:19.968:D/测试(4247):写入包裹2 id:22

06-25 17:47:19.988:D/测试(4247):读取包裹2 id:20

06-25 17:47:19.988:D/测试(4247):包裹1是:com.test。Parcelable1@4052e238id:11 p2:com.test。Parcelable2@4052e250p2.id:20

那是你的问题

资料来源:

  • 二十二
  • 包裹2
当您将source传递给parcelable2的构造函数时,22将被设置为parcelable2的id

您需要这样做:

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

你唯一出错的地方是:

parcelable2 = Parcelable2.CREATOR.createFromParcel(source);
应将其更改为:

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

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

Omg,我爱您!我花了几个小时在这上面。。。从某个示例中复制了它,但不认为这是错误的。但我不明白你的解释,22是预期的,但我得到20。我猜这只是一些混乱的价值。。。无论如何,接受和+1。当您将“源”传递到Parcelable2的构造函数时,它正在从Parcelable1读取id(因为该地块对应于应用于创建Parcelable1的数据)。很乐意帮忙。但是包裹1的id是11。可能是Parcelable2地址或值的一部分,这将是下一个要读取的元素。啊,你说得对。22可能是包裹上的一些垃圾数据。抢手货
id = source.readInt();
parcelable2 = source.readParcelable(Parcelable2.class.getClassLoader())
parcelable2 = Parcelable2.CREATOR.createFromParcel(source);
parcelable2 = source.readParcelable(Parcelable2.class.getClassLoader());