Это НЕ вопрос, заданный миллион раз о перечислениях.получить стандартное имя перечисления от значения
Я определяю перечисления как часть 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. Да, у них одинаковые имена, но я не могу полагаться на них с одинаковыми численными значениями.
просто взгляните на android source oode, как они реализуют такие вещи, как android: ориентация или андроид: gravity – pskink
@pskink Я посмотрел исходный код. Существует непротиворечивый метод, но, насколько я понимаю, кодировщики android полагаются на нумерацию своих перечислений ресурсов (attr в XML) так же, как и их java-константы (исходный код Java). Это, на мой взгляд, открытая дверь для ошибок. – ilomambo
это не может быть сделано иначе, как в attrs.xml, вы определяете значение = как int, а не строку – pskink