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!