为了账号安全,请及时绑定邮箱和手机立即绑定

在枚举上写入 Parcelable 会使应用程序崩溃

在枚举上写入 Parcelable 会使应用程序崩溃

偶然的你 2023-12-13 16:25:02
dest.writeParcelable(department, flags);当我通过意图包裹对象时,这条线导致应用程序崩溃。当我评论该行时,应用程序会通过,但当然我没有部门价值。public class User implements Parcelable {    public String id;    public String name;    public String email;    public Department department;    // other implementations of Parcelable protected UserVO(Parcel in) {    id = in.readString();    name = in.readString();    email = in.readString();    department = in.readParcelable(Department.class.getClassLoader());}    @Override    public void writeToParcel(Parcel dest, int flags) {        dest.writeString(id);        dest.writeString(name);        dest.writeString(email);        dest.writeParcelable(department, flags); // crashes    }}部门枚举public enum Department implements Parcelable {    SALES("Sales", 1),    HR("Human Resources", 2),    SHIPPING("Shipping", 3),    public final String name;    public final int ordinal;    Department(String name, int ordinal) {        this.name = name;        this.ordinal = ordinal;    }    Department(Parcel in) {        name = in.readString();        ordinal = in.readInt();    }    public static final Creator<Department> CREATOR = new Creator<Department>() {        @Override        public Department createFromParcel(Parcel in) {            return Department.valueOf(in.readString()); // crash            //return new DeptEnum(in); // android studio generated code but has error: enum types may not be instantiated        }        @Override        public Department[] newArray(int size) {            return new Department[size];        }    };    @Override    public int describeContents() {        return 0;    }    @Override    public void writeToParcel(Parcel parcel, int i) {        parcel.writeString(name);        parcel.writeInt(ordinal);    }}错误没有枚举常量 Department.Sales我从这个答案中得到了帮助return Department.valueOf(in.readString());
查看完整描述

1 回答

?
温温酱

TA贡献1752条经验 获得超4个赞

您不需要打包序号。单独对名称执行 valueOf 就可以了

但是,valueOf 的参数必须与枚举定义的名称完全匹配。

例如,这适用于销售和运输,但不适用于人力资源

Department.valueOf(in.readString().toUpperCase());

您需要的解决方案是循环并将Department.values()值的每个名称字段与 in.readString() 结果进行比较

如何从 Java 枚举的 String 值中查找它?

或者您可以像这样使用序数,尽管您正在复制序数信息并且必须保证枚举具有连续的数字

 return Department.values()[in.readInt() - 1]


查看完整回答
反对 回复 2023-12-13
  • 1 回答
  • 0 关注
  • 119 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信