Java enum上的write parcelable正在使应用程序崩溃
此行是Java enum上的write parcelable正在使应用程序崩溃,java,android,enums,parcelable,Java,Android,Enums,Parcelable,此行是dest.writeParceable(部门、标志)在我通过intent包裹对象时导致应用程序崩溃 当我评论这行时,应用程序会通过,但我当然没有部门价值 public class User implements Parcelable { public String id; public String name; public String email; public Department department; // other implemen
dest.writeParceable(部门、标志)代码>在我通过intent包裹对象时导致应用程序崩溃
当我评论这行时,应用程序会通过,但我当然没有部门价值
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);
}
}
你不需要把序号打包。在名字上单独做valueOf就可以了
但是,valueOf的参数必须与枚举定义的名称完全匹配
例如,这适用于销售和运输,但不适用于人力资源
Department.valueOf(in.readString().toUpperCase());
您需要的解决方案是循环遍历Department.values()
,并将值的每个名称字段与in.readString()结果进行比较
或者您可以像这样使用序数,尽管您复制序数信息,并且必须保证枚举具有序列号
return Department.values()[in.readInt() - 1]
好的,枚举是可序列化的。尝试删除所有的包裹
内容,并使用writeSerializable()
。谢谢,你能帮助我了解代码的编写位置和方法吗?我对这一点不熟悉,你的意思是dest.writeSerializable(部门)代码>?请同时查看.readParcelable(Department.class.getClassLoader())中的
,这里有什么变化吗?我尝试了WriteSeriable
,但出现了异常android.os.BadParcelableException:ParcelableProtocol需要从部门的Parcelable中进行子类化
,还是我应该反过来,依次写和读?为了使其简单易用,无法保证它也不会为null,但是return Department.values()[in.readInt()-1]
不能为null,这意味着有人没有指定序号?您使用的是枚举,因此需要定义所有值。不管怎样,整数都不能为空。我使用的是序数法,因为你说它对人力资源不起作用,我只想澄清一下你所说的是什么意思,不能保证它也不会为空
return Department.values()[in.readInt() - 1]