从值获取可设置的枚举名称

时间:2013-12-17 12:41:44

标签: java android enums declare-styleable

这不是一百万次关于枚举的问题。

我将枚举定义为可样式属性的一部分(对于自定义小部件)

<declare-styleable name="ColorPickerPreference">
    <attr name="colorMode">
        <enum name="HSV"    value="0"/>
        <enum name="RGB"    value="1"/>
        <enum name="CMYK"   value="2"/>
    </attr>
</declare-styleable>

然后我像这样使用它:

    <com.example.ColorPickerPreference
        android:key="@string/prefkey_color"
        android:title="@string/pref_color"
        android:summary="@string/pref_color_desc"
        custom:colorMode="RGB"/>

并且在首选构造函数中我想得到名称“RGB”。

public static enum ColorMode {
    RGB, HSV, CMYK
};

public ColorPickerPreference(Context context, AttributeSet attrs) {
    super(context, attrs);

    TypedArray a = context.getTheme().obtainStyledAttributes(attrs, R.styleable.ColorPickerPreference, 0, 0);
    try {
        String p = a.getString(R.styleable.ColorPickerPreference_colorMode);
        mColorMode = ColorMode.valueOf(p);
    } catch( Exception e ) {
        mColorMode = ColorMode.HSV;
    }

但这不起作用,a.getString(...)返回"1",这是“RGB”的值 并且我被抛出异常 mColorMode被分配null因为:

ColorMode.valueOf("1") == null

而不是

ColorMode.valueOf("RGB") == ColorMode.RGB

注意: 我想强调ColorMode不是导致问题的enum,我需要从中获取名称的枚举是问题顶部的枚举,用XML声明。是的,它们具有相同的名称,但我不能依赖它们具有相同的数值。

2 个答案:

答案 0 :(得分:0)

你应该尝试实现一个方法来检测你的枚举值,就像在这里描述的那样:How to find an enum according to a value?

对于懒惰的人:

public static enum ColorMode {
    RGB("1"), HSV("2"), CMYK("3")

    private String key;

    private static final Map<String, ColorMode> STRING_TO_ENUM = new HashMap<String, ColorMode>();

    static {
        for (ColorMode clrMode : ColorMode.values) {
            STRING_TO_ENUM.put(clrMode.key, clrMode);
        }
    }

    private ColorMode(String key) {
        this.key = key;
    }

    public ColorMode getByKey(String key) {
        return STRING_TO_ENUM.get(key);
    }   
};

然后你可以使用方法getByKey而不是方法valueOf来检索枚举的值。

答案 1 :(得分:0)

(错误回答后) 我没有好的答案,你必须把它编程出来。

    int ordinal = a.getInt(R.styleable.ColorPickerPreference_colorMode);
    mColorMode = ColorMode.values().get(ordinal ^ 1);

以上内容在很大程度上依赖于XML中的ad hoc编号,交换位0,并获得枚举的顺序。