假设attr
包aar
中定义了com.pack1
为
<attr name="attr0" format="string" />
并在另一个包中(说com.pack2
依赖于com.pack1
)我将styleable
定义为
<attr name="attr2" format="integer" />
<declare-styleable name="view2">
<attr name="attr1" format="string" />
<attr name="attr2" />
</declare-styleable>
我在com.pack2
中有一个自定义视图
public class View2 extends LinearLayout
{
public View2(Context context, AttributeSet attributeSet)
{
super(context, attributeSet);
View.inflate(context, R.layout.view2, this);
try
{
TypedArray typedArray = context.obtainStyledAttributes(attributeSet, R.styleable.view2);
{
if (typedArray.hasValue(R.styleable.view2_attr1))
{
String t = typedArray.getString(R.styleable.view2_attr1);
logger.debug("attr1 -> has value -> {}", t);
}
else
logger.debug("attr1 -> no value");
if (typedArray.hasValue(R.styleable.view2_attr2))
{
int t = typedArray.getInteger(R.styleable.view2_attr2, 0);
logger.debug("attr2 -> has value -> {}", t);
}
else
logger.debug("attr2 -> no value");
}
typedArray.recycle();
}
catch (Throwable t)
{
logger.debug(t.toString());
}
}
}
我将自定义视图添加到布局
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:custom="http://schemas.android.com/apk/res-auto"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent">
<com.pack2.View2
android:layout_width="fill_parent"
android:layout_height="wrap_content"
custom:attr1="this is a test"
custom:attr2="1000"
/>
</LinearLayout>
当我运行应用程序时,一切正常,记录器会报告
attr1 -> has value -> this is a test
attr2 -> has value -> 1000
但是一旦我将styleable
更改为
<attr name="attr2" format="integer" />
<declare-styleable name="view2">
<attr name="attr0" />
<attr name="attr1" format="string" />
<attr name="attr2" />
</declare-styleable>
并运行应用程序我收到了错误的结果。记录器报告
attr1 -> no value
发生了异常
java.lang.UnsupportedOperationException: Can't convert to integer: type=0x3
听起来像值&#34;这是一个测试&#34; 用于attr0
,尽管该属性未在布局中定义。请注意,应用程序编译正确,但结果是错误的。
为什么我会收到这个结果?