如何在使用Parcelable的活动之间传递具有其他对象列表的对象?

我有一个叫做Order的对象,我想在这些活动之间传递。目前我正在使用Parcelable这样做。如何在使用Parcelable的活动之间传递具有其他对象列表的对象?

public class Order implements Parcelable { 

private String email;

private Long timestamp;

private List<OrderItem> items;

public Order() { }

private Order(Parcel in) {

email = in.readString();

timestamp = in.readLong();

}

@Override

public void writeToParcel(Parcel dest, int flags) {

dest.writeString(email);

if (timestamp == null) {

dest.writeByte((byte) 0);

} else {

dest.writeByte((byte) 1);

dest.writeLong(timestamp);

}

dest.writeTypedList(items);

}

@Override

public int describeContents() {

return 0;

}

public static final Creator<Order> CREATOR = new Creator<Order>() {

@Override

public Order createFromParcel(Parcel in) {

return new Order(in);

}

@Override

public Order[] newArray(int size) {

return new Order[size];

}

};

// Getters

...

}

items字段是实现Parcelable接口OrderItemList对象。

public class OrderItem implements Parcelable { 

private String orderedClothingId;

private int quantity;

public OrderItem() { }

public OrderItem(String orderedClothingId, int quantity) {

this.orderedClothingId = orderedClothingId;

this.quantity = quantity;

}

private OrderItem(Parcel in) {

orderedClothingId = in.readString();

quantity = in.readInt();

}

@Override

public void writeToParcel(Parcel dest, int flags) {

dest.writeString(orderedClothingId);

dest.writeInt(quantity);

}

@Override

public int describeContents() {

return 0;

}

public static final Creator<OrderItem> CREATOR = new Creator<OrderItem>() {

@Override

public OrderItem createFromParcel(Parcel in) {

return new OrderItem(in);

}

@Override

public OrderItem[] newArray(int size) {

return new OrderItem[size];

}

};

}

我们从一个活动传递称为orderOrder对象到另一个我执行以下操作:

Intent intent = new Intent(mContext, ActivityTwo.class); 

intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);

intent.putExtra(ORDER_DETAIL_INTENT_EXTRA_KEY, order);

mContext.startActivity(intent);

ActivityTwo我收集像这样的Order对象:

Bundle data = getIntent().getExtras(); 

assert data != null;

mOrder = data.getParcelable(ORDER_DETAIL_INTENT_EXTRA_KEY);

然而,当我在中记录Order对象中包含的items字段时它是null。如何在没有items列表为空的活动之间传递原始非空Order对象?

回答:

首先你错过dest = in.readTypedList(emptyList, CREATOR);

但第二也是更重要的,你需要写读阵列回/读取相同ammount的参数,因为你有一个如果你writeToParcel您在阅读时需要的一样:

private Order(Parcel in) { 

email = in.readString();

if(in.readByte() == 1)

timestamp = in.readLong(); //here to skip just like the writeToParcel

in.readTypedList(items = new ArrayList<OrderItem>(), OrderItem.CREATOR);

}

@Override

public void writeToParcel(Parcel dest, int flags) {

dest.writeString(email);

if (timestamp == null) {

dest.writeByte((byte) 0);

} else {

dest.writeByte((byte) 1);

dest.writeLong(timestamp);

}

dest.writeTypedList(items);

}

回答:

从第一眼看起来,您好像在第一个中的可发送的 ORDER_DETAIL_INTENT_EXTRA_KEY以及第二个中的CLOTHING_ADMIN_DETAIL_INTENT_EXTRA_KEY中传递了不同的不同密钥。他们应该是相同的,所以选择哪一个。

您也可以使用getIntent().getParcelableExtra(),而不必使用Bundle

以上是 如何在使用Parcelable的活动之间传递具有其他对象列表的对象? 的全部内容, 来源链接: utcz.com/qa/267090.html

回到顶部