C'est une vieille question, mais tout le monde oublie de dire que les Enums sont en fait Serializable
et peut donc parfaitement être ajouté à un Intent en tant qu'extra. Comme ceci :
public enum AwesomeEnum {
SOMETHING, OTHER;
}
intent.putExtra("AwesomeEnum", AwesomeEnum.SOMETHING);
AwesomeEnum result = (AwesomeEnum) intent.getSerializableExtra("AwesomeEnum");
La suggestion d'utiliser des variables statiques ou à l'échelle de l'application est une très mauvaise idée. Cela couple réellement vos activités à un système de gestion d'état, et c'est difficile à maintenir, à déboguer et à résoudre les problèmes.
ALTERNATIVES :
Un bon point a été relevé par tedzyc sur le fait que la solution fournie par Oderik vous donne une erreur. Cependant, l'alternative proposée est un peu lourde à utiliser (même en utilisant des génériques).
Si vous êtes vraiment préoccupé par les performances de l'ajout de l'enum à un Intent, je propose ces alternatives à la place :
OPTION 1 :
public enum AwesomeEnum {
SOMETHING, OTHER;
private static final String name = AwesomeEnum.class.getName();
public void attachTo(Intent intent) {
intent.putExtra(name, ordinal());
}
public static AwesomeEnum detachFrom(Intent intent) {
if(!intent.hasExtra(name)) throw new IllegalStateException();
return values()[intent.getIntExtra(name, -1)];
}
}
Utilisation :
// Sender usage
AwesomeEnum.SOMETHING.attachTo(intent);
// Receiver usage
AwesomeEnum result = AwesomeEnum.detachFrom(intent);
OPTION 2 : (générique, réutilisable et découplé de l'enum)
public final class EnumUtil {
public static class Serializer<T extends Enum<T>> extends Deserializer<T> {
private T victim;
@SuppressWarnings("unchecked")
public Serializer(T victim) {
super((Class<T>) victim.getClass());
this.victim = victim;
}
public void to(Intent intent) {
intent.putExtra(name, victim.ordinal());
}
}
public static class Deserializer<T extends Enum<T>> {
protected Class<T> victimType;
protected String name;
public Deserializer(Class<T> victimType) {
this.victimType = victimType;
this.name = victimType.getName();
}
public T from(Intent intent) {
if (!intent.hasExtra(name)) throw new IllegalStateException();
return victimType.getEnumConstants()[intent.getIntExtra(name, -1)];
}
}
public static <T extends Enum<T>> Deserializer<T> deserialize(Class<T> victim) {
return new Deserializer<T>(victim);
}
public static <T extends Enum<T>> Serializer<T> serialize(T victim) {
return new Serializer<T>(victim);
}
}
Utilisation :
// Sender usage
EnumUtil.serialize(AwesomeEnum.Something).to(intent);
// Receiver usage
AwesomeEnum result =
EnumUtil.deserialize(AwesomeEnum.class).from(intent);
OPTION 3 (avec Kotlin) :
Cela fait un moment, mais comme nous avons maintenant Kotlin, j'ai pensé ajouter une autre option pour le nouveau paradigme. Ici, nous pouvons utiliser les fonctions d'extension et les types réifiés (qui conservent le type lors de la compilation).
inline fun <reified T : Enum<T>> Intent.putExtra(victim: T): Intent =
putExtra(T::class.java.name, victim.ordinal)
inline fun <reified T: Enum<T>> Intent.getEnumExtra(): T? =
getIntExtra(T::class.java.name, -1)
.takeUnless { it == -1 }
?.let { T::class.java.enumConstants[it] }
Il y a quelques avantages à procéder ainsi.
- Nous n'avons pas besoin de l'"overhead" d'un objet intermédiaire pour effectuer la sérialisation, car tout est fait en place grâce à la fonction
inline
qui remplacera les appels par le code à l'intérieur de la fonction.
- Les fonctions sont plus familières car elles sont similaires à celles du SDK.
- L'IDE complétera automatiquement ces fonctions, ce qui signifie qu'il n'est pas nécessaire d'avoir une connaissance préalable de la classe utilitaire.
L'un des inconvénients est que, si nous changeons l'ordre des Emums, toutes les anciennes références ne fonctionneront plus. Cela peut être un problème avec des choses comme les intents à l'intérieur des intents en attente, car ils peuvent survivre aux mises à jour. Cependant, pour le reste du temps, cela devrait être correct.
Il est important de noter que les autres solutions, comme l'utilisation du nom au lieu de la position, échoueront également si nous renommons l'une des valeurs. Cependant, dans ces cas, nous obtenons une exception au lieu de la valeur incorrecte de l'Enum.
Utilisation :
// Sender usage
intent.putExtra(AwesomeEnum.SOMETHING)
// Receiver usage
val result = intent.getEnumExtra<AwesomeEnum>()
0 votes
Peut-être que quelque chose m'échappe, mais comment un enum est-il lié à une ArrayList ?