-1

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

我将枚举定义为 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”的值,我得到一个抛出的异常 ,因为:mColorModenull

ColorMode.valueOf("1") == null

代替

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

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

4

2 回答 2

0

您应该尝试实现一种方法来通过 int 检索枚举的值,就像这里描述的那样:如何根据值查找枚举?

或者对于懒惰的人:

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 来检索枚举的值。

于 2013-12-17T12:55:05.587 回答
0

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

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

上面这在很大程度上依赖于 XML 中的临时编号,交换位 0,并获取枚举的顺序。

于 2013-12-17T13:00:30.767 回答