50 votes

Existe-t-il un modèle de recherche de ressources de chaîne Enum pour Android ?

J'ai une énumération où je dois afficher les valeurs sous forme de chaînes localisées. Mon approche actuelle a été la suivante :

 public enum MyEnum {
    VALUE1(R.string.VALUE1),
    VALUE2(R.string.VALUE2),
    .
    .
    VALUE10(R.string.VALUE10);

    private int mResId = -1;

    private MuEnum(int resId) {
        mResId = resId;
    }

    public String toLocalizedString(Resources r) {
        if (-1 != mResId) return (r.getString(mResId));
        return (this.toString());
    }
}

Existe-t-il un moyen plus simple de faire cela? J'adorerais si je pouvais en quelque sorte rechercher la ressource en fonction du nom de la valeur d'énumération (c'est-à-dire 'VALUE1').

 <?xml version="1.0" encoding="utf-8"?>
<resources>
    <string name="VALUE1"/>My string</string>
    <string name="VALUE2"/>My string 2</string>
    .
    .
    <string name="VALUE10"/>My string 3</string>
</resources>

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

EDIT : Juste pour référence future, c'est la solution qui a le mieux fonctionné pour moi :

 public enum MyEnum {
    VALUE1, 
    VALUE2, 
    . 
    . 
    VALUE10; 

    /**
     * Returns a localized label used to represent this enumeration value.  If no label
     * has been defined, then this defaults to the result of {@link Enum#name()}.  
     * 
     * <p>The name of the string resource for the label must match the name of the enumeration
     * value.  For example, for enum value 'ENUM1' the resource would be defined as 'R.string.ENUM1'.
     * 
     * @param context   the context that the string resource of the label is in.
     * @return      a localized label for the enum value or the result of name()
     */
    public String getLabel(Context context) {
        Resources res = context.getResources();
        int resId = res.getIdentifier(this.name(), "string", context.getPackageName());
        if (0 != resId) {
            return (res.getString(resId));
        }
        return (name());
    }
}

30voto

Ted Hopp Points 122617

Vous pouvez certainement rechercher une ressource par son nom en utilisant Resources.getIdentifier() . Par exemple, avec les ressources de chaîne que vous avez publiées à titre d'exemple, vous pouvez le faire à partir d'une activité :

 Resources res = getResources();
MyEnum e = MyEnum.VALUE1;
String localized = res.getString(res.getIdentifier(e.name(), "string", getPackageName()));

À partir d'une vue, vous devrez changer le dernier argument en getContext().getPackageName()

4voto

Damian JK Points 11
enum class MeasurementEnum(var position: Int, @StringRes
                    var userRedableStringRes: Int) {
    False(0, R.string.boolean_false),
    True(1,R.string.boolean_true)
}

2voto

Si vous sous-classez votre classe d'application, vous pouvez l'avoir en tant que singleton ( voir:http://androidcookbook.com/Recipe.seam?recipeId=1218 ) Une fois que vous avez obtenu votre instance singleton , vous pouvez l'utiliser dans toLocalizedString() pour obtenir l'objet ressource et se débarrasser du paramètre:

  public String getString() {
    return YourApp.getInstance().getResources().getString(resId);
}

voila - vous avez maintenant une interface propre.

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