124

列挙型のdeclare-styleable属性を使用して、カスタムビュー(ここにあります)を作成しました。xml で、カスタム属性の列挙型エントリの 1 つを選択できるようになりました。この値をプログラムで設定するメソッドを作成したいのですが、列挙型にアクセスできません。

attr.xml

<declare-styleable name="IconView">
    <attr name="icon" format="enum">
        <enum name="enum_name_one" value="0"/>
        ....
        <enum name="enum_name_n" value="666"/>
   </attr>
</declare-styleable>     

レイアウト.xml

<com.xyz.views.IconView
    android:id="@+id/heart_icon"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    app:icon="enum_name_x"/>

私が必要とするのは次のようなものです:mCustomView.setIcon(R.id.enum_name_x); しかし、列挙型が見つからないか、列挙型または列挙型の名前を取得する方法がわかりません。

4

5 に答える 5

105

属性列挙型からJava列挙型を取得する自動化された方法はないようです-Javaでは、指定した数値を取得できます-文字列はXMLファイルで使用されます(表示されているように)。

ビューコンストラクターでこれを行うことができます:

TypedArray a = context.getTheme().obtainStyledAttributes(
                attrs,
                R.styleable.IconView,
                0, 0);

    // Gets you the 'value' number - 0 or 666 in your example
    if (a.hasValue(R.styleable.IconView_icon)) {
        int value = a.getInt(R.styleable.IconView_icon, 0));
    }

    a.recycle();
}

値を列挙型に変換したい場合は、値を自分で Java 列挙型にマップする必要があります。

private enum Format {
    enum_name_one(0), enum_name_n(666);
    int id;

    Format(int id) {
        this.id = id;
    }

    static Format fromId(int id) {
        for (Format f : values()) {
            if (f.id == id) return f;
        }
        throw new IllegalArgumentException();
    }
}

次に、最初のコード ブロックで次を使用できます。

Format format = Format.fromId(a.getInt(R.styleable.IconView_icon, 0))); 

(ただし、この時点で例外をスローすることは良い考えではないかもしれませんが、適切なデフォルト値を選択する方がよいでしょう)

于 2013-09-24T20:58:14.667 に答える
13

正気のために。序数が、宣言されたスタイル可能オブジェクトと Enum 宣言と同じであることを確認し、配列としてアクセスしてください。

TypedArray a = context.getTheme().obtainStyledAttributes(
                   attrs,
                   R.styleable.IconView,
                   0, 0);

int ordinal = a.getInt(R.styleable.IconView_icon, 0);

if (ordinal >= 0 && ordinal < MyEnum.values().length) {
      enumValue = MyEnum.values()[ordinal];
}
于 2015-03-04T21:52:02.110 に答える