Comment append un object Enum à un bundle Android?
Il suffit de le passer comme int
depuis ordinal (). Restaurez-le à partir des valeurs [].
Les énumérations sont sérialisables, donc il n’y a pas de problème.
Compte tenu de la enum suivante:
enum YourEnum { TYPE1, TYPE2 }
Paquet:
// put bundle.putSerializable("key", YourEnum.TYPE1); // get YourEnum yourenum = (YourEnum) bundle.get("key");
Intention:
// put intent.putExtra("key", yourEnum); // get yourEnum = (YourEnum) intent.getSerializableExtra("key");
Je sais que c’est une vieille question, mais je suis venu avec le même problème et j’aimerais partager comment je l’ai résolu. La clé est ce que Miguel a dit: les énumérations sont sérialisables.
Compte tenu de la enum suivante:
enum YourEnumType { ENUM_KEY_1, ENUM_KEY_2 }
Mettre:
Bundle args = new Bundle(); args.putSerializable("arg", YourEnumType.ENUM_KEY_1);
Pour être complet, ceci est un exemple complet de la façon de mettre et de récupérer un enum d’un paquet.
Compte tenu de la enum suivante:
enum EnumType{ ENUM_VALUE_1, ENUM_VALUE_2 }
Vous pouvez mettre l’énumération dans un paquet:
bundle.putSerializable("enum_key", EnumType.ENUM_VALUE_1);
Et récupérer le enum:
EnumType enumType = (EnumType)bundle.getSerializable("enum_key");
Il peut être préférable de le passer sous forme de chaîne à partir de myEnumValue.name () et de le restaurer à partir de YourEnums.valueOf (s), sinon le classement de l’énum doit être préservé!
Explication plus longue: Convertir d’énumérique en enum
J’utilise kotlin.
companion object { private enum class Mode { MODE_REFERENCE, MODE_DOWNLOAD } }
puis mis en intention:
intent.putExtra(KEY_MODE, Mode.MODE_DOWNLOAD.name)
quand vous net pour obtenir de la valeur:
mode = Mode.valueOf(intent.getSsortingngExtra(KEY_MODE))
Une autre 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()); } }
Utilisez bundle.putSerializable (clé de chaîne, Serializable s) et bundle.getSerializable (clé de chaîne):
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
Une chose à prendre en compte: si vous utilisez bundle.putSerializable
pour append un ensemble à une notification, vous pouvez rencontrer le problème suivant:
*** Uncaught remote exception! (Exceptions are not yet supported across processes.) java.lang.RuntimeException: Parcelable encountered ClassNotFoundException reading a Serializable object. ...
Pour contourner ce problème, vous pouvez effectuer les opérations suivantes:
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); } } }
Qui peut alors être utilisé comme ça:
// Put Bundle bundle = new Bundle(); bundle.putInt("key", MyEnum.TYPE_0.getCode()); // Get MyEnum myEnum = MyEnum.fromCode(bundle.getInt("key"));
Un moyen simple, atsortingbuer une valeur entière à enum
Voir l’exemple suivant:
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; } }
Côté expéditeur:
Intent nextIntent = new Intent(CurrentActivity.this, NextActivity.class); nextIntent.putExtra("key_type", MyEnum.TYPE_ONE.getValue()); startActivity(nextIntent);
Côté récepteur:
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();
Je pense que convertir enum en int (pour un enum normal) et ensuite mettre en bundle a été le moyen le plus simple. aime ce code d’intention:
myIntent.PutExtra("Side", (int)PageType.Fornt);
alors pour vérifier l’état:
int type = Intent.GetIntExtra("Side",-1); if(type == (int)PageType.Fornt) { //To Do }
mais ne fonctionne pas pour tous les types enum!