Android开发:如何将Testendride对象传递到另一个Activity?
如何在Android中传递自定义对象到另一个Activity
你当前的代码存在两个核心问题:一是误用了putExtras方法(它接收的是Bundle而非单个对象),二是自定义类Testendride没有实现Android支持的序列化接口,导致无法通过Intent传递。下面给你三种可行的解决方案,按推荐程度排序:
方法一:使用Parcelable(Android官方推荐,效率最高)
Parcelable是Android专门设计的序列化方式,比Java原生的Serializable效率高很多,适合绝大多数场景。
步骤1:让Testendride实现Parcelable接口
需要实现接口的方法,并创建对应的CREATOR,注意读写数据的顺序必须完全一致:
public class Testendride implements Parcelable { // 你的成员变量 public Testendride guranteBoneses; // 其他自定义字段... public Testendride() {} // 从Parcel中读取数据的构造方法 protected Testendride(Parcel in) { // 读取顺序要和writeToParcel中的写入顺序完全匹配 guranteBoneses = in.readParcelable(Testendride.class.getClassLoader()); // 如果有其他字段,比如String name,就写name = in.readString(); } // 必须实现的CREATOR静态常量 public static final Creator<Testendride> CREATOR = new Creator<Testendride>() { @Override public Testendride createFromParcel(Parcel in) { return new Testendride(in); } @Override public Testendride[] newArray(int size) { return new Testendride[size]; } }; @Override public int describeContents() { return 0; // 一般返回0即可,除非包含特殊对象(如FileDescriptor) } @Override public void writeToParcel(Parcel dest, int flags) { // 按顺序写入所有成员变量 dest.writeParcelable(guranteBoneses, flags); // 其他字段比如dest.writeString(name); } }
注意:如果你的类中有其他自定义对象成员,那这个成员类也必须实现Parcelable;如果是集合(比如List),要用
dest.writeList()和in.readList()来处理。
步骤2:传递对象到目标Activity
修正你的Intent代码,使用putExtra而非putExtras:
Intent intent = new Intent(ActivityGuaranteeBonesesOffers.this, ActivityDetailGaurantee.class); intent.putExtra("key_gurantee", guranteBoneses); // 自定义一个键名,后续接收要对应 startActivity(intent);
步骤3:在目标Activity中接收对象
// Android 12及以下 Testendride receivedObject = getIntent().getParcelableExtra("key_gurantee"); // Android 13及以上,建议指定类类型以避免警告 Testendride receivedObject = getIntent().getParcelableExtra("key_gurantee", Testendride.class);
方法二:使用Serializable(最简单,代码量最少)
这是Java原生的序列化方式,实现起来非常简单,适合结构简单的对象。
步骤1:让Testendride实现Serializable接口
只需要加一个接口声明即可,不需要重写方法:
public class Testendride implements Serializable { // 你的成员变量 public Testendride guranteBoneses; // 其他字段... // 注意:如果有自定义对象成员,该成员类也必须实现Serializable }
步骤2:传递对象
Intent intent = new Intent(ActivityGuaranteeBonesesOffers.this, ActivityDetailGaurantee.class); intent.putExtra("key_gurantee", guranteBoneses); startActivity(intent);
步骤3:接收对象
Testendride receivedObject = (Testendride) getIntent().getSerializableExtra("key_gurantee");
方法三:转成JSON字符串传递(无需修改实体类)
既然你已经在用Gson处理JSON,也可以把对象重新转成JSON字符串传递,这种方式不需要修改Testendride类,适合复杂嵌套的对象。
步骤1:传递JSON字符串
Gson gson = new Gson(); String objectJson = gson.toJson(guranteBoneses); Intent intent = new Intent(ActivityGuaranteeBonesesOffers.this, ActivityDetailGaurantee.class); intent.putExtra("key_gurantee_json", objectJson); startActivity(intent);
步骤2:接收并还原对象
String jsonStr = getIntent().getStringExtra("key_gurantee_json"); Gson gson = new Gson(); Testendride receivedObject = gson.fromJson(jsonStr, Testendride.class);
最后纠正你原代码的错误
intent.putExtras("key", guranteBoneses);是错误用法:putExtras接收的是Bundle对象,而不是单个键值对,正确的是用putExtra。intent.putExtra("gurantee","gurantee");这段代码是多余的,如果你不需要传递这个字符串,可以直接删除。
内容的提问来源于stack exchange,提问作者Anaya Adana
相关产品推荐
相关产品推荐

