Android开发:如何通过Intent传递两个对象并使用getParcelableExtra获取?
解决Intent传递多个对象(含Parcelable)的崩溃问题
Hey there, let's break down what's causing your crash and fix it step by step!
你的代码里的两个关键问题
- 类型不匹配导致的错误:你传递的
localprice是double基本类型,但在接收时用了getParcelableExtra()——这个方法是用来获取实现了Parcelable接口的对象的,不能直接拿它取基本类型,这会直接引发类型转换异常。 - 传递对象错误:你想传递
Place对象,但代码里传的是clickedPlace.getId()(这应该是Place的ID值,比如int或String),而不是clickedPlace本身,这就导致接收时根本拿不到正确的Place实例。
修正后的完整代码
MainActivity.java(发送端)
// 假设clickedPlace是已经初始化好的Place实例,且Place已正确实现Parcelable Intent myIntent = new Intent(getApplicationContext(), Main2Activity.class); // 传递double类型数据,使用对应基本类型的putExtra重载 myIntent.putExtra("localprice", clickedPlace.getTicketId().getLocalPrice()); // 传递Parcelable类型的Place对象,直接传入实例 myIntent.putExtra("placeobject", clickedPlace); // 别忘了启动目标Activity! startActivity(myIntent);
Main2Activity.java(接收端)
double localPricePlace; Place getPressedPlace; // 获取double类型数据:用getDoubleExtra,第二个参数是取不到值时的默认值 localPricePlace = getIntent().getDoubleExtra("localprice", 0.0); // 获取Parcelable对象: // 如果你的项目适配API 33及以上,推荐用带类型参数的重载(更安全) getPressedPlace = getIntent().getParcelableExtra("placeobject", Place.class); // 如果适配的是API 33以下版本,用强转的方式: // getPressedPlace = (Place) getIntent().getParcelableExtra("placeobject");
额外注意事项
- 确保Place类正确实现Parcelable:这是传递自定义对象的前提,下面是一个标准的Parcelable实现示例(如果你的Place包含其他自定义对象,比如
TicketId,那TicketId也需要实现Parcelable):
public class Place implements Parcelable { private String id; private TicketId ticketId; // 假设TicketId也是自定义类,需实现Parcelable // 常规构造方法、Getter/Setter public Place(String id, TicketId ticketId) { this.id = id; this.ticketId = ticketId; } // Parcelable核心实现 protected Place(Parcel in) { id = in.readString(); // 读取嵌套的Parcelable对象 ticketId = in.readParcelable(TicketId.class.getClassLoader()); } public static final Creator<Place> CREATOR = new Creator<Place>() { @Override public Place createFromParcel(Parcel in) { return new Place(in); } @Override public Place[] newArray(int size) { return new Place[size]; } }; @Override public int describeContents() { return 0; // 一般返回0即可,除非涉及文件描述符 } @Override public void writeToParcel(Parcel dest, int flags) { dest.writeString(id); // 写入嵌套的Parcelable对象 dest.writeParcelable(ticketId, flags); } }
- Key值要完全匹配:发送时的
"localprice"和"placeobject",接收时必须用完全一样的字符串,大小写也要一致,否则会取不到值。
内容的提问来源于stack exchange,提问作者Mariam Mohie Sleem
相关产品推荐
相关产品推荐

