11 ответов:
перечисления являются Сериализуемыми, поэтому нет никаких проблем.
учитывая следующее перечисление:
enum YourEnum { TYPE1, TYPE2 }Bundle:
// put bundle.putSerializable("key", YourEnum.TYPE1); // get YourEnum yourenum = (YourEnum) bundle.get("key");цель:
// put intent.putExtra("key", yourEnum); // get yourEnum = (YourEnum) intent.getSerializableExtra("key");
Я знаю, что это старый вопрос, но я пришел с той же проблемой, и я хотел бы поделиться, как я ее решил. Ключ в том, что сказал Мигель: перечисления Сериализуемы.
учитывая следующее перечисление:
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() и восстановить его из YourEnums.valueOf(s), так как в противном случае порядок перечисления должен быть сохранен!
более длинное объяснение:конвертировать из перечисления порядковый номер в перечисление типа
Я использую Котлин.
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))
другой вариант:
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()); } }
бандл.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
одно дело быть в курсе, если вы используете
bundle.putSerializableнаBundleчтобы добавить в уведомление, Вы можете столкнуться со следующей проблемой:*** 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"));
простой способ, присвоить целочисленное значение enum
рассмотрим следующий пример:
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();
Я думаю, что преобразовать enum в int (для обычного перечисления), а затем установить на bundle было проще всего. как этот код для намерения:
myIntent.PutExtra("Side", (int)PageType.Fornt);затем для проверки состояния:
int type = Intent.GetIntExtra("Side",-1); if(type == (int)PageType.Fornt) { //To Do }но не работает для всех типов перечисления!
Comments