404 votes

Android : Comment mettre une Enum dans un Bundle ?

Comment ajouter un objet Enum à un Bundle Android ?

12 votes

À mon avis, ce conseil du personnel de Google est mauvais. Les énumérations sont très pratiques et souffrir du surdébit décrit en vaut la peine.

3 votes

Pouvez-vous revoir les réponses et accepter la 2ème si vous pensez que c'est un meilleur choix.

6 votes

Sous le titre "Éviter les énumérations" dans le lien ci-dessus, il est maintenant indiqué ceci : Mythes de performance Les versions précédentes de ce document contenaient des affirmations trompeuses. Nous en abordons certaines ici.

833voto

miguel Points 1537

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

En supposant l'énumération suivante:

enum YourEnum {
  TYPE1,
  TYPE2
}

Bundle:

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

// get 
YourEnum yourenum = (YourEnum) bundle.get("key");

Intent:

// put
intent.putExtra("key", yourEnum);

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

0 votes

Est-ce qu'il y a quelque chose de mal avec cette méthode: enregistrer: outState.putSerializable("trollData", game.getFunkyTrolls()); charger: game.setFunkyTrolls((Game.FunkyTroll[]) savedInstanceState.getSerializable("trollData")); ?

24 votes

J'aurais voté pour votre réponse, mais la question portait sur l'ajout de l'énumération à un Bundle et votre réponse explique comment l'ajouter à un Intent ... Certes, c'est presque la même chose, mais Alejandro ci-dessous a corrigé votre réponse.

2 votes

Lorsque vous l'utilisez avec Bundle, cela lance ClassNotFoundException

173voto

Alejandro Colorado Points 3062

Je sais que c'est une vieille question, mais j'ai eu le même problème et je voudrais partager comment je l'ai résolu. La clé est ce que Miguel a dit: les Enums sont Serializable.

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

enum YourEnumType {
    ENUM_KEY_1, 
    ENUM_KEY_2
}

Mettez:

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

3 votes

Basé sur ceci: stackoverflow.com/questions/15521309/…, les Enums personnalisés ne sont pas sérialisables. Par conséquent, les champs personnalisés dans un Enum ne seront pas sérialisés. Comment gérez-vous cela?

0 votes

Belle question @clu ! Peut-être devriez-vous alors penser à la transmettre comme une chaîne comme indiqué dans stackoverflow.com/questions/609860/…

0 votes

@clu En ne s'attendant pas à ce que les champs personnalisés soient sérialisés. Ça marche bien s'il s'agit simplement d'une énumération normale comme dans le code ci-dessus.

50voto

TheIT Points 2022

Pour des raisons de complétude, voici un exemple complet de comment insérer et récupérer un enum à partir d'un bundle.

Étant donné l'enum suivant :

enum EnumType{
    ENUM_VALUE_1,
    ENUM_VALUE_2
}

Vous pouvez insérer l'enum dans un bundle :

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

Et récupérer l'enum :

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

17voto

user602359 Points 101

Il peut être préférable de le passer en tant que chaîne à partir de myEnumValue.name() et le restaurer à partir de YourEnums.valueOf(s), sinon l'ordre de l'énumération doit être préservé!

Explication plus détaillée: Convertir de l'ordinal d'énumération au type d'énumération

1 votes

L'ordre n'a pas d'importance si la sérialisation->désérialisation se produit immédiatement à l'exécution, comme lors de l'appel d'une activité à une autre. Cela pourrait poser problème entre les processus tels que l'envoi d'Intent d'une application à des anciennes versions de l'application.

6voto

Charlie Jones Points 1

Une autre option:

public enum DataType implements Parcelable {
    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());
    }
}

1 votes

Vous pouvez utiliser soit putSerializable(clé, valeur)/(Type) getSerializable(clé) soit putString(clé, valeur.nom())/Type.valueOf(getString(clé)), l'implémentation Parcelable ici est redondante et dénuée de sens.

1 votes

En utilisant Parcelable est une bonne solution pour stocker des tableaux de valeurs Enum.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X