枚举上的可分割包裹使应用程序崩溃

问题描述 投票:0回答:1

此行是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);
    }
}

错误

没有枚举常量部门。销售

我从answer那里获得了return Department.valueOf(in.readString());行的帮助


观察

我想它必须同时具有名称和顺序值,我的枚举类型并不像链接的答案中那样简单,因此我需要通过包裹创建一个枚举。

public Department createFromParcel(Parcel in) {
    Log.d("abc", "createFromParcel: " + in.readString()); // returns null
    Log.d("abc", "createFromParcel: " + in.readInt()); // returns 127 or 128
    return SHIPPING; // hard coded value works but of course not a solution
}
java android enums parcelable
1个回答
0
投票

您无需将序号打包。仅在名称上执行valueOf就可以了

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

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

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

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

How can I lookup a Java enum from its String value?

或者您可以像这样使用序数,尽管您要复制序数信息并且必须保证枚举具有序号

 return Department.values()[in.readInt() - 1]
© www.soinside.com 2019 - 2024. All rights reserved.