You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android开发:如何通过Intent传递两个对象并使用getParcelableExtra获取?

解决Intent传递多个对象(含Parcelable)的崩溃问题

Hey there, let's break down what's causing your crash and fix it step by step!

你的代码里的两个关键问题

  1. 类型不匹配导致的错误:你传递的localprice是double基本类型,但在接收时用了getParcelableExtra()——这个方法是用来获取实现了Parcelable接口的对象的,不能直接拿它取基本类型,这会直接引发类型转换异常。
  2. 传递对象错误:你想传递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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 06:54:51