Bundle携带List传递

本文介绍了如何使用Parcelable接口将List对象通过Bundle在Android中传递。首先,实现Parcelable接口并重写相关方法,然后创建Parcelable.Creator,接着在构造函数中解析Parcel数据。最后,将序列化的List放入Bundle,并在接收方取出。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

使用Bundle携带对象 传递 数据
1. 将数据序列化 实现 Parcelable 接口,重写 方法describeContents返回 默认 数值 0即可 ,重写writeToParcel(Parcel out, int flags) 方法将数据 out.writeString(pics),数据顺序要相同不能乱
2. 添加这一部分方法 public static final Parcelable.Creator CREATOR = new Parcelable.Creator() {
public FriendList createFromParcel(Parcel in) {
return new FriendList(in);
}

    public FriendList[] newArray(int size) {
        return new FriendList[size];
    }
};

3. 构造这个方法 private FriendList(Parcel in) {
this.pics = in.readString();
this.names = in.readString();
this.infos = in.readString();
this.sortletterss = in.readString();
this.id = in.readString();
}
4.序列化完成
5.传递Bundle类型数据

undle bundle = new Bundle();
bundle.putParcelableArrayList(“selectfriendLists”, selectfriendLists);
6.接收数据
Bundle bundle = getIntent().getExtras();
if(!bundle.isEmpty() && bundle!=null){

    ArrayList<FriendList> selectFriend = bundle.getParcelableArrayList("selectfriendLists");
    }

7。对象的序列化如下

import android.os.Parcel;
import android.os.Parcelable;

public class FriendList implements Parcelable {

private String pics;
private String names;
private String infos;
private String sortletterss;
private String id;

public String getId() {
    return id;
}

public void setId(String id) {
    this.id = id;
}

public String getPics() {
    return pics;
}

public void setPics(String pics) {
    this.pics = pics;
}

public String getNames() {
    return names;
}

public void setNames(String names) {
    this.names = names;
}

public String getInfos() {
    return infos;
}

public void setInfos(String infos) {
    this.infos = infos;
}

public String getSortletterss() {
    return sortletterss;
}

public void setSortletterss(String sortletterss) {
    this.sortletterss = sortletterss;
}

@Override
public int describeContents() {
    // TODO Auto-generated method stub
    return 0;
}

@Override
public void writeToParcel(Parcel out, int flags) {
    // TODO Auto-generated method stub
    out.writeString(pics);
    out.writeString(names);
    out.writeString(infos);
    out.writeString(sortletterss);
    out.writeString(id);
}

public static final Parcelable.Creator<FriendList> CREATOR = new Parcelable.Creator<FriendList>() {
    public FriendList createFromParcel(Parcel in) {
        return new FriendList(in);
    }

    public FriendList[] newArray(int size) {
        return new FriendList[size];
    }
};

private FriendList(Parcel in) {
    this.pics = in.readString();
    this.names = in.readString();
    this.infos = in.readString();
    this.sortletterss = in.readString();
    this.id = in.readString();
}

public FriendList() {
    super();
}

public FriendList(String pics, String names, String infos, String sortletterss, String id) {
    super();
    this.pics = pics;
    this.names = names;
    this.infos = infos;
    this.sortletterss = sortletterss;
    this.id = id;
}

}

<think>嗯,用户想知道在Android的Activity之间如何传递枚举类型的数据。我之前记得枚举在Java中默认是实现了Serializable接口的,所以可能可以通过Intent的putExtra方法直接传递。不过得确认一下具体的实现步骤。 首先,根据引用[4],Parcelable的效率比Serializable高,但如果是枚举的话,可能更方便用Serializable,因为枚举默认已经实现了Serializable。所以用户可能有两种方法:一种是使用Serializable,另一种是自定义Parcelable实现。 引用[5]中提到,可以通过bundle.getSerializable来获取枚举,这说明使用putExtra时应该用putSerializable方法。比如定义一个枚举类型,然后在启动Activity的时候,用intent.putExtra("key", enumValue),然后在接收方用getSerializableExtra("key")获取,并强制转换为对应的枚举类型。 但用户可能想知道有没有更高效的方法。比如,引用[4]提到Parcelable适合进程间通信,效率更高,但枚举本身不支持Parcelable,所以可能需要手动实现。不过枚举是单例的,可能传递实例会有问题,所以或许应该传递名称或者ordinal值,然后在接收方重新获取枚举实例。 不过直接传递枚举作为Serializable可能更简单,虽然效率不如Parcelable,但对于大部分情况来说已经足够。如果用户需要优化性能,可能需要将枚举转换为字符串或整型传递,然后在接收方解析。例如,使用enum.name()传递字符串,再通过Enum.valueOf()方法转换回来。这样避免了序列化的开销,但需要处理类型转换。 另外,引用[2]提到在传递数据时,处理boolean、String、List、Enum等类型,其中Enum可能通过Serializable传递。而引用[5]中的代码示例展示了如何通过getSerializable获取枚举,并强制类型转换。这也验证了使用Serializable的可行性。 所以总结步骤应该是:发送方使用intent.putExtra传递枚举实例,接收方通过getSerializableExtra获取,并转换为对应的枚举类型。或者,如果担心效率,可以传递名称或ordinal,再转换回来。需要提醒用户注意枚举在Proguard混淆时可能需要保持,否则可能引发问题。 可能还需要提到两种方法的优缺点,比如Serializable方便但性能稍差,而传递名称或ordinal更高效但需要手动处理转换。此外,使用Bundle携带数据,或者在Kotlin中使用更简洁的方式处理。 最后,生成的相关问题可能涉及枚举在Android中的其他应用、性能优化、替代方案等。</think>在Android中通过Intent传递枚举类型数据主要有两种实现方式: ### 一、基于Serializable的标准方法 1. **定义枚举类型** ```java public enum FRUITS { APPLE, BANANA, ORANGE } ``` 2. **发送数据Activity** ```java Intent intent = new Intent(this, TargetActivity.class); intent.putExtra("FRUIT_KEY", FRUITS.APPLE); // 自动装箱为Serializable startActivity(intent); ``` 3. **接收数据Activity** ```java FRUITS receivedFruit = (FRUITS) getIntent().getSerializableExtra("FRUIT_KEY"); ``` ### 二、基于Parcelable的优化方案 1. **创建可序列化包装类** ```java public class EnumParcel<T extends Enum<T>> implements Parcelable { private final T value; public EnumParcel(T value) { this.value = value; } protected EnumParcel(Parcel in) { Class<T> enumType = (Class<T>) in.readSerializable(); this.value = Enum.valueOf(enumType, in.readString()); } public T getValue() { return value; } // Parcelable实现代码... } ``` 2. **发送端使用** ```java Intent intent = new Intent(this, TargetActivity.class); intent.putExtra("FRUIT_PARCEL", new EnumParcel<>(FRUITS.BANANA)); startActivity(intent); ``` **注意要点:** 1. 枚举默认支持Serializable序列化,但需要注意ProGuard规则防止混淆 2. 直接传递枚举时建议使用`getSerializableExtra()`方法接收[^5] 3. 当传递自定义枚举参数时,推荐使用包装类保证类型安全[^4]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值