创建并传递给自定义视图的RobotoAttributeSet
看起来永远不会被错误地读取或构建。
这是我的测试:
ArrayList<Attribute> attributes = new ArrayList<>();
attributes.add(
new Attribute("com.package.name:attr/CustomButton_inputType",
String.valueOf(2), "com.package.name")); // no matter what value I use (2)
AttributeSet attrs =
new RoboAttributeSet(attributes, Robolectric.application.getResources(), CustomButton.class);
CustomButton button = new CustomButton(Robolectric.application, attrs);
这是我的attr.xml
:
<?xml version="1.0" encoding="utf-8"?>
<resources>
<declare-styleable name="CustomButton">
<attr name="inputType" format="enum">
<enum name="text" value="0"/>
<enum name="textEmailAddress" value="1"/>
<enum name="password" value="2"/>
</attr>
</declare-styleable>
</resources>
CustomButton的一部分:
private void applyAttributes(Context context, AttributeSet attrs) {
TypedArray typedArray = context.getTheme()
.obtainStyledAttributes(attrs, R.styleable.CustomButton, 0, 0);
try {
int typeValue = // is always 0
typedArray.getInt(R.styleable.CustomButton_inputType, 0);
switch (typeValue) {
case 0:
// do something
break;
case 1:
// do something
break;
case 2:
// do something
break;
default:
// just do nothing
break;
}
} finally {
typedArray.recycle();
}
}
因此,无论我在准备属性时设置了什么值(示例中为2
),我始终会0
获得typeValue
。
我做错了吗?非常感谢!
答案 0 :(得分:3)
问题来自您的测试,尤其是传递给AttributeSet的值。 实际上,您应该传递枚举的名称字段,而不是传递枚举的值字段,因此您可以在视图后面获取关联的值字段。
attributes.add(
new Attribute("com.package.name:attr/CustomButton_inputType",
"textEmailAddress", "com.package.name"));
希望这可以帮助:) 此外,请不要犹豫,看看my post dealing with custom attributes。
答案 1 :(得分:0)
尝试
attributes.add(
new Attribute("com.package.name:attr/inputType",
String.valueOf(2), "com.package.name"));