首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >其他Parcelable包含的Parcelable没有写入/读取正确的值

其他Parcelable包含的Parcelable没有写入/读取正确的值
EN

Stack Overflow用户
提问于 2012-06-25 15:53:51
回答 2查看 1.4K关注 0票数 2

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

我构造了一个完整的例子

Parcelable1

代码语言:javascript
运行
复制
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

代码语言:javascript
运行
复制
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的活动:

代码语言:javascript
运行
复制
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);
        }
    });
}
}

接收活动:

代码语言:javascript
运行
复制
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/test(4107):读Parcelable2 id:0 06-25 17:45:29.440: D/test(4107):parcelable 1 is: com.test.Parcelable1@4052e430id: 11 p2: com.test.Parcelable2@4052e6e0 p2.id: 0 06-25 17:47:19.968: D/test(4247):写Parcelable2 id:22 06-25 17:47:19.988: D/test(4247):读Parcelable2 id:20 06-25 17:47:19.988: D/test(4247):parcelable 1 is: com.test.Parcelable1@4052e238id: 11 p2: com.test.Parcelable2@4052e250 p2.id: 20

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-06-25 16:14:47

代码语言:javascript
运行
复制
parcelable2 = Parcelable2.CREATOR.createFromParcel(source);

这是你的问题。

来源:

  • 22
  • Parcelable2

当将源代码传递给Parcelable 2的构造函数时,22被设置为Parcelable 2的id。

你需要这样做:

代码语言:javascript
运行
复制
id = source.readInt();
parcelable2 = source.readParcelable(Parcelable2.class.getClassLoader())
票数 4
EN

Stack Overflow用户

发布于 2012-06-25 16:23:35

你唯一出错的地方是:

代码语言:javascript
运行
复制
parcelable2 = Parcelable2.CREATOR.createFromParcel(source);

应改为:

代码语言:javascript
运行
复制
parcelable2 = source.readParcelable(Parcelable2.class.getClassLoader());

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

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11192787

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档