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