Comment obtenir une énumération créée dans attrs.xml dans le code

J’ai créé une vue personnalisée (recherchez-la ici ) avec un atsortingbut declare-styleable de type enum. Dans xml, je peux maintenant choisir l’une des entrées énumérées pour mon atsortingbut personnalisé. Maintenant, je veux créer une méthode pour définir cette valeur par programmation, mais je ne peux pas accéder à l’énumération.

attr.xml

   ....    

layout.xml

  

Ce dont j’ai besoin est quelque chose comme: mCustomView.setIcon(R.id.enum_name_x); Mais je ne peux pas trouver l’énumération ou je n’ai même aucune idée de la façon dont je peux obtenir l’énumération ou les noms de la énumération.

Il ne semble pas y avoir de moyen automatisé pour obtenir une énumération Java à partir d’un énumérateur d’atsortingbut – en Java, vous pouvez obtenir la valeur numérique que vous avez spécifiée – la chaîne doit être utilisée dans les fichiers XML (comme vous le voyez).

Vous pouvez le faire dans votre constructeur de vues:

 TypedArray a = context.getTheme().obtainStyledAtsortingbutes( attrs, R.styleable.IconView, 0, 0); // Gets you the 'value' number - 0 or 666 in your example if (a.hasValue(R.styleable.IconView_icon)) { int value = a.getInt(R.styleable.IconView_icon, 0)); } a.recycle(); } 

Si vous voulez la valeur dans une enum, vous devrez soit mapper la valeur dans un enum Java, par exemple:

 private enum Format { enum_name_one(0), enum_name_n(666); int id; Format(int id) { this.id = id; } static Format fromId(int id) { for (Format f : values()) { if (f.id == id) return f; } throw new IllegalArgumentException(); } } 

Ensuite, dans le premier bloc de code, vous pouvez utiliser:

 Format format = Format.fromId(a.getInt(R.styleable.IconView_icon, 0))); 

(bien que lancer une exception à ce stade ne soit pas une bonne idée, il vaut probablement mieux choisir une valeur par défaut raisonnable)

Bien pour la santé mentale. Assurez-vous que vos ordinaux sont les mêmes dans votre style déclaré que dans votre déclaration Enum et accédez-y en tant que tableau.

 TypedArray a = context.getTheme().obtainStyledAtsortingbutes( attrs, R.styleable.IconView, 0, 0); int ordinal = a.getInt(R.styleable.IconView_icon, 0); if (ordinal >= 0 && ordinal < MyEnum.values().length) { enumValue = MyEnum.values()[ordinal]; } 

Je sais que ça fait un moment que la question a été publiée, mais j’ai eu le même problème récemment. J’ai piraté un petit quelque chose qui utilise le JavaPoet de Square et quelques éléments du build.gradle qui crée automatiquement une classe Java enum à partir du fichier attrs.xml lors de la génération du projet.

Il y a une petite démo et un fichier Lisez-moi avec une explication à https://github.com/afterecho/create_enum_from_xml

J’espère que cela aide.