type tutorial stringdef example enum android enums android-bundle

tutorial - enum type java android



Android: ¿Cómo poner un Enum en un paquete? (12)

Creo que convertir la enumeración en int (para la enumeración normal) y luego establecer el paquete fue la forma más fácil. como este código de intención:

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

luego para verificar el estado:

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

¡Pero no funciona para todo tipo de enumeración!

¿Cómo agregar un objeto Enum a un paquete de Android?


En aras de la integridad, este es un ejemplo completo de cómo colocar y recuperar una enumeración de un paquete.

Teniendo en cuenta la siguiente enumeración:

enum EnumType{ ENUM_VALUE_1, ENUM_VALUE_2 }

Puedes poner la enumeración en un paquete:

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

Y recuperar la enumeración:

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


Enums son serializables por lo que no hay problema.

Teniendo en cuenta la siguiente enumeración:

enum YourEnum { TYPE1, TYPE2 }

Haz:

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

Intención:

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


Otra opción:

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


Para Intención puedes usar de esta manera:

Intención: kotlin

FirstActivity:

val intent = Intent(context, SecondActivity::class.java) intent.putExtra("type", typeEnum.A) startActivity(intent)

SecondActivity:

override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) //... val type = (intent.extras?.get("type") as? typeEnum.Type?) }


Puede ser mejor pasarlo como una cadena desde myEnumValue.name () y restaurarlo desde YourEnums.valueOf (s), ya que de lo contrario se debe conservar el orden de la enumeración.

Explicación más larga: Convertir de enum ordinal a enum type


Sé que esta es una pregunta antigua, pero tuve el mismo problema y me gustaría compartir cómo lo resolví. La clave es lo que dijo Miguel: los enumerados son serializables.

Teniendo en cuenta la siguiente enumeración:

enum YourEnumType { ENUM_KEY_1, ENUM_KEY_2 }

Poner:

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


Una cosa a tener en cuenta es que, si está utilizando bundle.putSerializable para que se bundle.putSerializable un Bundle a una notificación, podría encontrar el siguiente problema:

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

Para solucionar esto, puedes hacer lo siguiente:

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

Que luego se puede utilizar como tal:

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


Una forma simple, asigna un valor entero a enumeración

Vea el siguiente ejemplo:

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

Lado del remitente:

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

Lado del receptor:

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


Use bundle.putSerializable (clave de cadena, serializables) y bundle.getSerializable (clave de cadena):

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

Documentación: http://developer.android.com/reference/android/os/Bundle.html


Yo uso kotlin

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

luego poner en Intención:

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

cuando netas para obtener valor:

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


Solo pásalo como int de ordinal (). Restaurarlo desde valores [].