如果您可以直接从AttributeSet中读取,为什么需要声明样式?

时间:2013-01-03 15:35:51

标签: android android-xml attr android-custom-view declare-styleable

我使用以下构造函数创建了一个自定义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.xmlcontext.getTheme().obtainStyledAttributes()定义自定义视图的XML属性(讨论here)并通过调用{{1}}来应用它们(讨论{{ 3}})?

1 个答案:

答案 0 :(得分:3)

我很蠢。我发布的第二个链接解释了原因:

  

从XML布局创建视图时,其中包含所有属性   XML标记从资源包中读取并传递给   将构造函数视为AttributeSet。虽然有可能阅读   来自AttributeSet的值,这样做有一些   缺点:

     
      
  • 未解析属性值中的资源引用
  •   
  • 未应用样式
  •   
     

相反,将AttributeSet传递给   obtainStyledAttributes()。此方法传回TypedArray数组   已被解除引用和设置样式的值。