这不是一百万次关于枚举的问题。
我将枚举定义为可样式属性的一部分(对于自定义小部件)
<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声明。是的,它们具有相同的名称,但我不能依赖它们具有相同的数值。
答案 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,并获得枚举的顺序。