-1

これは、列挙型について何百万回も尋ねられる質問ではありません。

列挙型をスタイル可能な属性の一部として定義します (カスタム ウィジェットの場合)

<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;
    }

しかし、これは機能せず、「RGB」の値をa.getString(...)返し、スローされた例外が割り当てられます。"1" 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);
    }   
};

次に、メソッド valueOf の代わりにメソッド getByKey を使用して、列挙型の値を取得できます。

于 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 に答える