Android: Как поместить Enum в Bundle?

Как вы добавляете объект Enum в Android Bundle?

Solutions Collecting From Web of "Android: Как поместить Enum в Bundle?"

Просто передайте его как int from ordinal (). Восстановите его из значений [].

Перечисления являются Serializable, поэтому проблем нет.

Учитывая следующее перечисление:

 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"); 

Я знаю, что это старый вопрос, но я столкнулся с той же проблемой, и я хотел бы поделиться тем, как я ее решил. Ключ – это то, что сказал Мигель: Enums являются Serializable.

Учитывая следующее перечисление:

 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 } 

Вы можете перевести enum в пакет:

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

И верните перечисление:

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

Может быть, лучше передать его как строку из myEnumValue.name () и восстановить его из YourEnums.valueOf (s), так как в противном случае порядок перечисления должен быть сохранен!

Более длинное объяснение: преобразовать из enum ordinal в тип перечисления

Другой вариант:

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

}

Я использую котлин.

 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)) 

Используйте 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(); 

Я думаю, что преобразовать enum в int (для обычного перечисления), а затем установить на пучок было проще всего. Как этот код для намерения:

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

То для проверки состояния:

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

Но не работает для всех типов перечислений!