Android:如何将Enum放入捆绑包中?

zer*_*lus 307 enums android android-bundle

如何将Enum对象添加到Android Bundle?

mig*_*uel 685

枚举是可序列化的,所以没有问题.

鉴于以下枚举:

enum YourEnum {
  TYPE1,
  TYPE2
}
Run Code Online (Sandbox Code Playgroud)

束:

// put
bundle.putSerializable("key", YourEnum.TYPE1);

// get 
YourEnum yourenum = (YourEnum) bundle. getSerializable("key");
Run Code Online (Sandbox Code Playgroud)

意图:

// put
intent.putSerializableExtra("key", yourEnum);

// get
yourEnum = (YourEnum) intent.getSerializableExtra("key");
Run Code Online (Sandbox Code Playgroud)

  • 我本来会投票给你的答案,但问题是关于将Enum添加到Bundle中你的回复解释了如何将它添加到Intent ......虽然这几乎是同样的事情,但下面的Alejandro修正了你的答案. (20认同)
  • 当它与Bundle一起使用时,它会抛出`ClassNotFoundException` (2认同)
  • 这可能超级慢,不会扩展到包含枚举等的数组.请参阅http://stackoverflow.com/a/5551155/175156 (2认同)

Ale*_*ado 160

我知道这是一个老问题,但我遇到了同样的问题,我想分享一下我是如何解决它的.关键是Miguel说的:Enums是Serializable.

鉴于以下枚举:

enum YourEnumType {
    ENUM_KEY_1, 
    ENUM_KEY_2
}
Run Code Online (Sandbox Code Playgroud)

放:

Bundle args = new Bundle();
args.putSerializable("arg", YourEnumType.ENUM_KEY_1);
Run Code Online (Sandbox Code Playgroud)

  • 基于此:http://stackoverflow.com/questions/15521309/is-custom-enum-serializable-too,自定义枚举不可序列化.因此,枚举中的自定义字段不会被序列化.你怎么处理这个? (3认同)

The*_*eIT 39

为了完整起见,这是一个完整的例子,说明如何从一个包中输入和获取一个枚举.

鉴于以下枚举:

enum EnumType{
    ENUM_VALUE_1,
    ENUM_VALUE_2
}
Run Code Online (Sandbox Code Playgroud)

你可以将枚举放入一个包中:

bundle.putSerializable("enum_key", EnumType.ENUM_VALUE_1);
Run Code Online (Sandbox Code Playgroud)

并获得枚举:

EnumType enumType = (EnumType)bundle.getSerializable("enum_key");
Run Code Online (Sandbox Code Playgroud)


Vla*_*lav 30

我用kotlin.

companion object {

        enum class Mode {
            MODE_REFERENCE,
            MODE_DOWNLOAD
        }
}
Run Code Online (Sandbox Code Playgroud)

然后投入意图:

intent.putExtra(KEY_MODE, Mode.MODE_DOWNLOAD.name)
Run Code Online (Sandbox Code Playgroud)

当你净获得价值:

mode = Mode.valueOf(intent.getStringExtra(KEY_MODE))
Run Code Online (Sandbox Code Playgroud)

  • 这是一个很好的答案,但是可以用一种扩展方法来补充,我在这里使用它:https://gist.github.com/Grohden/eea5ff9d5e3ba955aa2f57ff0df2683f (5认同)

小智 17

最好从myEnumValue.name()传递它作为字符串,并从YourEnums.valueOf(s)恢复它,否则必须保留枚举的顺序!

更长的解释:从枚举序号转换为枚举类型


小智 6

另外一个选项:

public enum DataType implements Parcleable {
    SIMPLE, COMPLEX;

    public static final Parcelable.Creator<DataType> CREATOR = new Creator<DataType>() {

        @Override
        public DataType[] newArray(int size) {
            return new DataType[size];
        }

        @Override
        public DataType createFromParcel(Parcel source) {
            return DataType.values()[source.readInt()];
        }
    };

    @Override
    public int describeContents() {
        return 0;
    }

    @Override
    public void writeToParcel(Parcel dest, int flags) {
        dest.writeInt(this.ordinal());
    }
}
Run Code Online (Sandbox Code Playgroud)