自定义Android属性的完全限定名称?

时间:2015-11-18 23:02:57

标签: android robolectric

我正在为项目编写单元测试,我正在以编程方式创建自定义组件。我遇到的问题是我需要传递属性的完全限定名称,并且我无法弄清楚我的项目attrs.xml文件中包含的自定义属性的样子。

@Test
public void test_ContextAndAttributeConstructorWithActivityTest() {
    Resources resources = RuntimeEnvironment.application.getResources();
    ResourceLoader resourceLoader = Shadows.shadowOf(resources).getResourceLoader();

    ArrayList<Attribute> attributes = new ArrayList<>();
    attributes.add(new Attribute("com.example.application.view.ActivityActionButton:attr/activityName", "TestActivity.class", "com.example.application")); // this doesn't works
    attributes.add(new Attribute("android:attr/text", "Example Text", "com.example.application")); // this works
    RoboAttributeSet attributeSet = new RoboAttributeSet(attributes, resourceLoader);

    assertEquals(2, attributeSet.getAttributeCount());

    ActivityActionButton activityActionButton = new ActivityActionButton(context, attributeSet);

    assertEquals("Example Text", activityActionButton.getText()); // this passes

    assertEquals("TestActivity.class", activityActionButton.getActivityName()); // this fails
}

这是我的代码目前的示例,其中包名称由com.example.application进行了模糊处理。

我瘦下来的attrs.xml文件看起来像这样:

<?xml version="1.0" encoding="utf-8"?>
<resources>

    <declare-styleable name="ActivityActionButton">
        <attr name="activityName" format="string" />
    </declare-styleable>

</resources>

那么activityName的完全限定名称是什么?

另外:组件确实正常运行,所以我知道我的问题属于我作为完全限定名称传递的内容。

1 个答案:

答案 0 :(得分:0)

令人惊奇的是新的一天和咖啡可以做些什么。我能够弄清楚自定义属性的完全限定名称是什么,现在我的单元测试正在通过。

在提到我的问题时,名称为com.example.application:attr/activityName。所以工作示例如下:

@Test
public void test_ContextAndAttributeConstructorWithActivityTest() {
    Resources resources = RuntimeEnvironment.application.getResources();
    ResourceLoader resourceLoader = Shadows.shadowOf(resources).getResourceLoader();

    ArrayList<Attribute> attributes = new ArrayList<>();
    attributes.add(new Attribute("com.example.application:attr/activityName", "TestActivity.class", "com.example.application"));
    attributes.add(new Attribute("android:attr/text", "Example Text", "com.example.application"));
    RoboAttributeSet attributeSet = new RoboAttributeSet(attributes, resourceLoader);

    assertEquals(2, attributeSet.getAttributeCount());

    ActivityActionButton activityActionButton = new ActivityActionButton(context, attributeSet);

    assertEquals("Example Text", activityActionButton.getText());

    assertEquals("TestActivity.class", activityActionButton.getActivityName());
}