How do you add an Enum object to an Android Bundle?
问题:
回答1:
Just pass it as int from ordinal(). Restore it from values[].
回答2:
Enums are Serializable so there is no issue.
Given the following enum:
enum YourEnum { TYPE1, TYPE2 } Bundle:
// put bundle.putSerializable("key", YourEnum.TYPE1); // get YourEnum yourenum = (YourEnum) bundle.get("key"); Intent:
// put intent.putExtra("key", yourEnum); // get yourEnum = (YourEnum) intent.getSerializableExtra("key"); 回答3:
I know this is an old question, but I came with the same problem and I would like to share how I solved it. The key is what Miguel said: Enums are Serializable.
Given the following enum:
enum YourEnumType { ENUM_KEY_1, ENUM_KEY_2 } Put:
Bundle args = new Bundle(); args.putSerializable("arg", YourEnumType.ENUM_KEY_1); 回答4:
For completeness sake, this is a full example of how to put in and get back an enum from a bundle.
Given the following enum:
enum EnumType{ ENUM_VALUE_1, ENUM_VALUE_2 } You can put the enum into a bundle:
bundle.putSerializable("enum_key", EnumType.ENUM_VALUE_1); And get the enum back:
EnumType enumType = (EnumType)bundle.getSerializable("enum_key"); 回答5:
It may be better to pass it as string from myEnumValue.name() and restore it from YourEnums.valueOf(s), as otherwise the enum's ordering must be preserved!
Longer explanation: Convert from enum ordinal to enum type
回答6:
I use kotlin.
companion object { private enum class Mode { MODE_REFERENCE, MODE_DOWNLOAD } } then put into Intent:
intent.putExtra(KEY_MODE, Mode.MODE_DOWNLOAD.name) when you net to get value:
mode = Mode.valueOf(intent.getStringExtra(KEY_MODE)) 回答7:
Another option:
public enum DataType implements Parcleable { SIMPLE, COMPLEX; public static final Parcelable.Creator CREATOR = new Creator() { @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()); } }
回答8:
Use bundle.putSerializable(String key, Serializable s) and bundle.getSerializable(String key):
enum Mode = { BASIC, ADVANCED } Mode m = Mode.BASIC; bundle.putSerializable("mode", m); ... Mode m; m = bundle.getSerializable("mode"); Documentation: http://developer.android.com/reference/android/os/Bundle.html
回答9:
One thing to be aware of -- if you are using bundle.putSerializable for a Bundle to be added to a notification, you could run into the following issue:
*** Uncaught remote exception! (Exceptions are not yet supported across processes.) java.lang.RuntimeException: Parcelable encountered ClassNotFoundException reading a Serializable object. ... To get around this, you can do the following:
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); } } } Which can then be used like so:
// Put Bundle bundle = new Bundle(); bundle.putInt("key", MyEnum.TYPE_0.getCode()); // Get MyEnum myEnum = MyEnum.fromCode(bundle.getInt("key")); 回答10:
A simple way, assign integer value to enum
See the following example:
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; } } Sender Side:
Intent nextIntent = new Intent(CurrentActivity.this, NextActivity.class); nextIntent.putExtra("key_type", MyEnum.TYPE_ONE.getValue()); startActivity(nextIntent); Receiver Side:
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(); 回答11:
I think convert enum to int (for normal enum) and then set on bundle was been easiest way. like this code for intent:
myIntent.PutExtra("Side", (int)PageType.Fornt); then for check state:
int type = Intent.GetIntExtra("Side",-1); if(type == (int)PageType.Fornt) { //To Do } but not work for all enum type!