2013-12-17 4 views
-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» и я получаю исключение брошенную mColorMode присваивается null, потому что:

ColorMode.valueOf("1") == null 

вместо

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

ПРИМЕЧАНИЕ: Я хочу подчеркнуть, что ColorMode не является enum, что вызывает проблему, для перечисления, которое мне нужно получить от имени, является тот, который находится в верхней части вопроса, объявленный в XML. Да, у них одинаковые имена, но я не могу полагаться на них с одинаковыми численными значениями.

+0

просто взгляните на android source oode, как они реализуют такие вещи, как android: ориентация или андроид: gravity – pskink

+0

@pskink Я посмотрел исходный код. Существует непротиворечивый метод, но, насколько я понимаю, кодировщики android полагаются на нумерацию своих перечислений ресурсов (attr в XML) так же, как и их java-константы (исходный код Java). Это, на мой взгляд, открытая дверь для ошибок. – ilomambo

+0

это не может быть сделано иначе, как в attrs.xml, вы определяете значение = как int, а не строку – pskink

ответ

0

(После того, как неправильный ответ) У меня нет хорошего ответа, вы должны запрограммировать его.

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

Это выше в значительной мере опирается на специальной нумерации в XML, свопы бит 0, и получает порядок перечисления.

+0

ваше предложение не компилируется, 'valueOf()' требует аргумент 'String', а не' int'. Во всяком случае, мне кажется, что 'R.styleable.ColorPickerPreference_colorMode' указывает на контейнер атрибута, а не его значение. – ilomambo

+0

Мне стыдно, :). Изменен ответ на что-то полезное. –

+0

Спасибо, я пытался избежать этого. Но я буду использовать специальную коррелированную нумерацию, если нет другого выбора. – ilomambo

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 для получения значения перечисления.

+0

В вашем сообщении не ясно, как применить его к перечислениям, объявленным как атрибуты, как я описал. Пожалуйста, напишите код, который будет делать трюк. – ilomambo

+0

Я не буду делать эту работу. Если вы не можете читать 3 строки Java с другого поста, сделайте это самостоятельно. – Julien

+0

Я прочитал ваше сообщение, вы используете там перечисления, определенные в java, а не в XML. Как бы то ни было, он не работает для моей проблемы, и я не знаю, как «перевести» ваш код, чтобы он работал. Итак, если вы знаете ответ, скажите это прямо. Это форум помощи, а не форум эго. – ilomambo

 Смежные вопросы

  • Нет связанных вопросов^_^