Issue
Я хочу добавить следующий атрибут в пользовательское представление, которое я создаю в Android:
<attr name="sourceType" format="enum">
<enum name="generic" value="???" />
<enum name="dash" value="???" />
<enum name="smooth_streaming" value="???" />
<enum name="hls" value="???" />
</attr>
Внутренне в своем коде я хотел бы использовать перечисление для представленияразличные типы источников:
public enum SourceType {
Generic, DASH, SmoothStreaming, HLS;
}
Однако в моем собственном представлении я не уверен, как преобразовать значение атрибута в перечисление:
public BFPlayer(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
TypedArray attributes = context.obtainStyledAttributes(attrs, R.styleable.BFPlayer);
// Clearly wrong:
// 1. SourceType.Generic cannot be cast to int
// 2. int cannot be cast to SourceType
SourceType sourceType = attributes.getInt(R.styleable.BFPlayer_sourceType, SourceType.Generic);
}
Что я пробовал
Я подумал сделать что-то вроде следующего:
attrs.xml
<attr name="sourceType" format="enum">
<enum name="generic" value="1" />
<enum name="dash" value="2" />
<enum name="smooth_streaming" value="3" />
<enum name="hls" value="4" />
</attr>
SourceType.java
public enum SourceType {
Generic (1), DASH (2), SmoothStreaming (3), HLS (4);
private int value;
private SourceType(int value) {
this.value = value;
}
public int getValue() {
return value;
}
public static SourceType fromInt(int value) {
switch (value) {
case 1: return Generic;
case 2: return DASH;
case 3: return SmoothStremaing;
case 4: return HLS;
default: throw new Error("Invalid SourceType");
}
}
}
BFPlayer.java
public BFPlayer(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
TypedArray attributes = context.obtainStyledAttributes(attrs, R.styleable.BFPlayer);
// Clearly wrong:
// 1. SourceType.Generic cannot be cast to int
// 2. int cannot be cast to SourceType
SourceType sourceType = SourceType.fromInt(
attributes.getInt(R.styleable.BFPlayer_sourceType, SourceType.Generic.getValue())
);
}
Однако это похоже на неправильное решение:
- Это требует использования
.fromtInt
и .getValue
для создания экземпляра нового SourceType - Требуется обновить инструкцию switch, если я добавлю новые значения
- Произвольно назначает целочисленные значения каждомуoption
Есть ли лучшее решение?