我使用以下构造函数创建了一个自定义View子类:
public MyCustomView(Context context, AttributeSet attrs)
{
super(context, attrs);
// get custom "thingy" attribute specified in XML
int thingy = attrs.getAttributeIntValue(MY_NAMESPACE, "thingy", 0);
//rest of constructor
...
}
可以看出,它从XML属性中获取了自定义的“thingy”属性。这绝对没问题,到目前为止我没有遇到任何问题。那么为什么Google会告诉您在declare-styleable
res/values/attrs.xml
中context.getTheme().obtainStyledAttributes()
定义自定义视图的XML属性(讨论here)并通过调用{{1}}来应用它们(讨论{{ 3}})?
答案 0 :(得分:3)
我很蠢。我发布的第二个链接解释了原因:
从XML布局创建视图时,其中包含所有属性 XML标记从资源包中读取并传递给 将构造函数视为AttributeSet。虽然有可能阅读 来自AttributeSet的值,这样做有一些 缺点:
- 未解析属性值中的资源引用
- 未应用样式
相反,将AttributeSet传递给 obtainStyledAttributes()。此方法传回TypedArray数组 已被解除引用和设置样式的值。