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

Fully Qualified Name For Custom Android Attributes?

我正在为项目编写单元测试,并且正在以编程方式创建自定义组件。我 运行 遇到的问题是我需要传入属性的完全限定名称,但我无法确定我的项目 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 的完全限定名称是什么?

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

新的一天和咖啡的效果真是太棒了。我能够弄清楚自定义属性的完全限定名称是什么,现在我的单元测试通过了。

关于我的问题,名字是 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());
}