此行是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
}
您无需将序号打包。仅在名称上执行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]