public enum MyEnum implements Parcelable {
VALUE;
@Override
public int describeContents() {
return 0;
}
@Override
public void writeToParcel(final Parcel dest, final int flags) {
dest.writeInt(ordinal());
}
public static final Creator<MyEnum> CREATOR = new Creator<MyEnum>() {
@Override
public MyEnum createFromParcel(final Parcel source) {
return MyEnum.values()[source.readInt()];
}
@Override
public MyEnum[] newArray(final int size) {
return new MyEnum[size];
}
};
}
class Example implements Parcelable {
public enum Foo { BAR, BAZ }
public Foo fooValue;
public void writeToParcel(Parcel dest, int flags) {
parcel.writeString(fooValue == null ? null : fooValue.name());
}
public static final Creator<Example> CREATOR = new Creator<Example>() {
public Example createFromParcel(Parcel source) {
Example e = new Example();
String s = source.readString();
if (s != null) e.fooValue = Foo.valueOf(s);
return e;
}
}
}
12 回答
有可能使您的Enum实现Serializable然后您可以通过Intent传递它,因为有一种方法可以将它作为可序列化传递 . 使用int而不是枚举的建议是假的 . 枚举用于使代码更易于阅读和维护 . 它将向黑暗时代倒退一大步,无法使用Enums .
这是一个古老的问题,但每个人都没有提到Enums实际上是
Serializable
因此可以完美地添加到Intent作为额外的 . 像这样:使用静态或应用程序范围变量的建议是一个非常糟糕的主意 . 这确实将您的活动与状态管理系统结合在一起,很难维护,调试和解决问题 .
ALTERNATIVES:
tedzyc注意到Oderik提供的解决方案给您一个错误,这是一个很好的观点 . 然而,提供的替代方案有点崩溃 - 一些使用(甚至使用泛型) .
如果您真的担心将枚举添加到意图中的表现,我建议使用这些替代方案:
选项1:
用法:
选项2 :(通用,可重用和与枚举分离)
用法:
你可以使你的enum实现Parcelable,这对枚举非常简单:
然后,您可以使用Intent.putExtra(String,Parcelable) .
更新:请注意wreckgar的评论,
enum.values()
在每次通话时分配一个新阵列 .您可以将枚举作为字符串传递 .
在支持字符串的情况下,您应该能够毫无问题地传递枚举值 .
要通过意图传递枚举,您可以将枚举转换为整数 .
例如:
发送(枚举为整数):
接收(整数到枚举):
最好的祝福 . :)
如果您确实需要,可以使用
name()
和valueOf(String)
将枚举序列化为String,如下所示:如果你的枚举有可变状态(他们不应该,真的),这显然不起作用 .
关于Oderik的帖子:
如果你定义一个MyEnum变量myEnum,然后执行intent.putExtra(“Parcelable1”,myEnum),你会得到一个“方法putExtra(String,Parcelable)对于Intent类型是不明确的”错误信息 . 因为还有一个Intent.putExtra(String,Parcelable)方法,而原始的'Enum'类型本身实现了Serializable接口,所以编译器不知道选择哪个方法(intent.putExtra(String,Parcelable /或Serializable)) .
建议从MyEnum中删除Parcelable接口,并将核心代码移动到wrap类'Parcelable实现中,就像这样(Father2是一个Parcelable并包含一个枚举字段):
然后我们可以这样做:
你可以使用enum的enum构造函数来获得原始数据类型 .
你可以使用传递int作为额外的东西然后使用它的值从枚举中拉出它 .
我喜欢简单 .
Fred活动有两种模式 -
HAPPY
和SAD
.创建一个静态
IntentFactory
,为您创建Intent
. 把它传递给你想要的Mode
.IntentFactory
使用Mode
类的名称作为额外名称 .IntentFactory
使用name()
将Mode
转换为String
进入
onCreate
后,使用此信息转换回Mode
.您也可以使用
ordinal()
和Mode.values()
. 我喜欢字符串,因为我可以在调试器中看到它们 .我认为你最好的选择是将这些列表转换成可以分配的东西,比如字符串(或 Map ?),以便将它转换为Activity . 然后Activity必须将其转换回数组 .
实施自定义parcelables是脖子上的痛苦恕我直言,所以我会尽可能避免它 .
考虑以下enum ::
传球::
从intent / bundle / arguments中检索回::
不要使用枚举 . 原因#78不使用枚举 . :)使用整数,可以通过Bundle和Parcelable轻松地远程控制 .