使用String将枚举写入parcel

我有这样的Parcelable枚举:

public enum Option implements Parcelable { DATA_BASE, TRIPS, BIG_PHOTOS, OLD_PHOTOS, FILTERS_IMAGES, CATEGORIES_IMAGES, PAGES, SOUNDS, PUBLIC_TRANSPORT, MAPS; public static final Parcelable.Creator CREATOR = new Parcelable.Creator() { public Option createFromParcel(Parcel in) { return Option.values()[in.readInt()]; } public Option[] newArray(int size) { return new Option[size]; } }; @Override public int describeContents() { return 0; } @Override public void writeToParcel(Parcel out, int flags) { out.writeInt(ordinal()); } } 

现在我修改了它,它看起来像:

  public enum Option implements Parcelable { DATA_BASE("Database"), TRIPS("Trips"), BIG_PHOTOS("BigPhotos"), OLD_PHOTOS("OldPhotos"), FILTERS_IMAGES("FiltersImages"), CATEGORIES_IMAGES("CategoriesImages"), PAGES("Pages"), SOUNDS("Sounds"), PUBLIC_TRANSPORT("PublicTransport"), MAPS("Maps"); private String option; Option(String option){ this.option = option; } public String getName(){ return option; } public static final Parcelable.Creator CREATOR = new Parcelable.Creator() { public Option createFromParcel(Parcel in) { //... } public Option[] newArray(int size) { //... } }; @Override public int describeContents() { return 0; } @Override public void writeToParcel(Parcel out, int flags) { //... } } 

我应该如何在这个枚举中实现writeToParcel(),createFromParcel()和newArray()int? 我需要通过额外的意图传递它。

这是一个老问题,但有一个更好的解决方案:

 dest.writeString(myEnumOption.name()); 

 myEnumOption = MyEnum.valueOf(in.readString()); 

我通过以下方式解决了

 public enum Option implements Parcelable { DATA_BASE("Database"), TRIPS("Trips"), BIG_PHOTOS("BigPhotos"), OLD_PHOTOS("OldPhotos"), FILTERS_IMAGES("FiltersImages"), CATEGORIES_IMAGES("CategoriesImages"), PAGES("Pages"), SOUNDS("Sounds"), PUBLIC_TRANSPORT("PublicTransport"), MAPS("Maps"); private String option; Option(String option){ this.option = option; } public String getName(){ return option; } private void setOption(String option){ this.option = option; } public static final Parcelable.Creator 

对于OP可能会迟到,但它可能对其他人有所帮助,所以我仍然会发布这个。

  1. 正如前面提到的那样,将枚举器设置为枚举成员是一种不好的做法。 如果您需要该成员,请将其作为最终成员(这不包括设置者的可能性)

  2. 您不需要将该成员(在您的情况下为String’选项’)保存到包中并在重新创建时将其恢复。

我的实施如下

 public enum Option implements Parcelable { DATA_BASE("Database"), TRIPS("Trips"), BIG_PHOTOS("BigPhotos"), OLD_PHOTOS("OldPhotos"), FILTERS_IMAGES("FiltersImages"), CATEGORIES_IMAGES("CategoriesImages"), PAGES("Pages"), SOUNDS("Sounds"), PUBLIC_TRANSPORT("PublicTransport"), MAPS("Maps"); private final String option; Option(String option){ this.option = option; } public String getName() { return option; } public static final Parcelable.Creator 

如果你制作枚举Parcelable的唯一原因是将它传递给Intent ,你不需要这样做。 枚举是可Serializable ,所以您可以像下面这样传递它:

 intent.putExtra("EnumValue", Option.DATA_BASE); 

并使用以下方法检索它

 Option myEnum = (Option) intent.getSerializableExtra("EnumValue");