如何获得在代码中的attrs.xml中创build的枚举

我用enumtypes的declare-styleable属性创build了一个自定义View(在这里find它)。 在XML中,我现在可以select我的自定义属性的枚举条目之一。 现在我想创build一个方法来设置此值编程,但我不能访问枚举。

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> 

layout.xml

 <com.xxx.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); 但我找不到枚举,或者我甚至不知道如何获得枚举的枚举或名称。

谢谢

似乎没有从属性枚举中获得Java枚举的自动方法 – 在Java中,您可以获得指定的数字值 – 该string用于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))); 

(尽pipe在这一点上抛出一个exception可能不是一个好主意,但select一个合理的默认值可能更好)

那么为了理智呢 确保你的序号和你的Enum声明中声明的样式相同,并以数组的forms访问它。

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

我知道这个问题发布以来已经有一段时间了,但是最近我也遇到了同样的问题。 我使用了Square的JavaPoet以及build.gradle中的一些东西,在项目构build中从attrs.xml自动创buildJava枚举类。

https://github.com/afterecho/create_enum_from_xml上有一个演示和一个自述文件;

希望能帮助到你。