Android:如何把一个枚举放在一个包中?

如何添加一个Enum对象到Android Bundle?

只需从ordinal()传入int 。 从值[]中恢复。

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

鉴于以下枚举:

 enum YourEnum { TYPE1, TYPE2 } 

束:

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

意图:

 // put intent.putExtra("key", yourEnum); // get yourEnum = (YourEnum) intent.getSerializableExtra("key"); 

我知道这是一个古老的问题,但是我遇到了同样的问题,我想分享我是如何解决这个问题的。 关键是Miguel所说的:枚举是可序列化的。

鉴于以下枚举:

 enum YourEnumType { ENUM_KEY_1, ENUM_KEY_2 } 

放:

 Bundle args = new Bundle(); args.putSerializable("arg", YourEnumType.ENUM_KEY_1); 

为了完整起见,这是一个完整的例子,如何从一个包中获取枚举。

鉴于以下枚举:

 enum EnumType{ ENUM_VALUE_1, ENUM_VALUE_2 } 

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

 bundle.putSerializable("enum_key", EnumType.ENUM_VALUE_1); 

并得到枚举回来:

 EnumType enumType = (EnumType)bundle.getSerializable("enum_key"); 

最好从myEnumValue.name()以string的forms传递,并从YourEnums.valueOf(s)中恢复它,否则必须保留枚举的顺序!

更长的解释: 从枚举序列转换为枚举types

我用kotlin。

 companion object { private enum class Mode { MODE_REFERENCE, MODE_DOWNLOAD } } 

然后把意图:

 intent.putExtra(KEY_MODE, Mode.MODE_DOWNLOAD.name) 

当你净赚到价值:

 mode = Mode.valueOf(intent.getStringExtra(KEY_MODE)) 

另外一个select:

 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()); } 

}

使用bundle.putSerializable(String key,Serializable s)和bundle.getSerializable(String key):

 enum Mode = { BASIC, ADVANCED } Mode m = Mode.BASIC; bundle.putSerializable("mode", m); ... Mode m; m = bundle.getSerializable("mode"); 

文档: http : //developer.android.com/reference/android/os/Bundle.html

一个简单的方法,分配整数值枚举

看下面的例子:

 public enum MyEnum { TYPE_ONE(1), TYPE_TWO(2), TYPE_THREE(3); private int value; MyEnum(int value) { this.value = value; } public int getValue() { return value; } } 

发件人方:

 Intent nextIntent = new Intent(CurrentActivity.this, NextActivity.class); nextIntent.putExtra("key_type", MyEnum.TYPE_ONE.getValue()); startActivity(nextIntent); 

接收方:

 Bundle mExtras = getIntent().getExtras(); int mType = 0; if (mExtras != null) { mType = mExtras.getInt("key_type", 0); } /* OR Intent mIntent = getIntent(); int mType = mIntent.getIntExtra("key_type", 0); */ if(mType == MyEnum.TYPE_ONE.getValue()) Toast.makeText(NextActivity.this, "TypeOne", Toast.LENGTH_SHORT).show(); else if(mType == MyEnum.TYPE_TWO.getValue()) Toast.makeText(NextActivity.this, "TypeTwo", Toast.LENGTH_SHORT).show(); else if(mType == MyEnum.TYPE_THREE.getValue()) Toast.makeText(NextActivity.this, "TypeThree", Toast.LENGTH_SHORT).show(); else Toast.makeText(NextActivity.this, "Wrong Key", Toast.LENGTH_SHORT).show(); 

有一件事要注意 – 如果你使用Bundle bundle.putSerializable被添加到通知,你可能会遇到以下问题:

 *** Uncaught remote exception! (Exceptions are not yet supported across processes.) java.lang.RuntimeException: Parcelable encountered ClassNotFoundException reading a Serializable object. ... 

为了解决这个问题,你可以这样做:

 public enum MyEnum { TYPE_0(0), TYPE_1(1), TYPE_2(2); private final int code; private MyEnum(int code) { this.code = navigationOptionLabelResId; } public int getCode() { return code; } public static MyEnum fromCode(int code) { switch(code) { case 0: return TYPE_0; case 1: return TYPE_1; case 2: return TYPE_2; default: throw new RuntimeException( "Illegal TYPE_0: " + code); } } } 

然后可以这样使用:

 // Put Bundle bundle = new Bundle(); bundle.putInt("key", MyEnum.TYPE_0.getCode()); // Get MyEnum myEnum = MyEnum.fromCode(bundle.getInt("key")); 

我认为将枚举转换为int(对于普通枚举),然后设置捆绑是最简单的方法。 像这个意图代码:

 myIntent.PutExtra("Side", (int)PageType.Fornt); 

然后检查状态:

 int type = Intent.GetIntExtra("Side",-1); if(type == (int)PageType.Fornt) { //To Do } 

但不适用于所有枚举types!