永远不会读取Robolectric的RoboAttributeSet

时间:2015-01-06 15:16:52

标签: android robolectric

创建并传递给自定义视图的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

我做错了吗?非常感谢!

2 个答案:

答案 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"));