web-dev-qa-db-fra.com

Android: Comment mettre un Enum dans un Bundle?

Comment ajouter un objet Enum à un bundle Android?

271
zer0stimulus

Les énumérations sont sérialisables, il n'y a donc aucun problème. 

Étant donné l'énumération 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");
611
miguel

Je sais que c'est une vieille question, mais je suis venu avec le même problème et je voudrais partager comment je l'ai résolu. La clé est ce que Miguel a dit: Les énumérations sont sérialisables.

Étant donné l'énumération suivante:

enum YourEnumType {
    ENUM_KEY_1, 
    ENUM_KEY_2
}

Mettre:

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

Par souci d'exhaustivité, ceci est un exemple complet de la façon de mettre en place et de récupérer une enum d'un paquet.

Étant donné l'énumération suivante:

enum EnumType{
    ENUM_VALUE_1,
    ENUM_VALUE_2
}

Vous pouvez mettre l'énum dans un paquet:

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

Et récupère l'énumération:

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

J'utilise Kotlin.

companion object {

        enum class Mode {
            MODE_REFERENCE,
            MODE_DOWNLOAD
        }
}

puis mis en intention:

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

quand vous êtes net pour obtenir de la valeur:

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

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 l'ordre de l'énum doit être conservé!

Explication plus longue: Conversion de type enum ordinal en type enum

15
user602359

Une autre option: 

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

Utilisez bundle.putSerializable (clé de chaîne, serializable) 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

2
Gotcha

Une chose à savoir: si vous utilisez bundle.putSerializable pour ajouter une Bundle à 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 résoudre ce problème, vous pouvez procéder comme suit:

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

Ce qui peut alors être utilisé comme suit:

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

// Get 
MyEnum myEnum = MyEnum.fromCode(bundle.getInt("key"));
1
Smalls

Pour Intention vous pouvez utiliser cette méthode:

Intention: kotlin

Première activité:

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

Deuxième activité:

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

Une manière simple, assigner 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();
0
Mehdi Esmaeili

Je pense que convertir enum en int (pour enum normal) et ensuite mis en bundle a été plus simple. comme ce code d'intention:

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

puis pour vérifier l'état:

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

mais ne fonctionne pas pour tout type d'énum!

0
amir ahmadi