声明风格和风格之间的区别

我开始玩我的Android应用程序中的样式等等,到目前为止我已经完成了所有工作。 我完全理解指南的“风格” 部分 。

但是,环顾四周,就像在这个post中一样 ,我无法弄清楚两者之间的区别( declare-stylablestyle )。 根据我的理解, declare-styleable获取其中指定的属性并将其指定为可样式,然后从代码中根据需要更改它。

但如果这是它真正做的,那么在布局中定义属性会不会更简单? 或者声明一个指定它的样式?

Solutions Collecting From Web of "声明风格和风格之间的区别"

我认为将属性声明为可样式与否之间只有以下区别。

在attrs.xml中,您可以直接在“resources”部分或“declare-styleable”中声明自定义属性:

 < ?xml version="1.0" encoding="utf-8"?>      

所以现在我们将“attrib1”定义为非样式,将“attrib2”定义为样式。

layout/someactivity.xml我们可以直接使用这些属性(不需要命名空间):

  

您可以在style.xml声明中使用“styleable”属性“attrib2”。 同样,这里不需要命名空间(即使在布局XML中使用了命名空间)。

   

然后,您还可以设置每个样式的属性。

  

让我们假设我们这样做:我们直接在XML中设置attrib2 ,并在一个样式中设置attrib2

在其他地方,我看到描述说“ blahblah ”必须是使用这些属性的自定义视图类的名称,并且您需要使用命名空间来引用布局XML中的自定义属性。 但这似乎都不是必要的。

styleable和non-styleable之间的区别似乎是:

  • 您可以在“ style.xml ”声明中使用可设置的属性。
  • 自定义类的构造函数需要以不同的方式读取样式和非样式属性:带有obtainStyledAttributes()的样式属性,带有attr.getAttributeValue()或类似的非样式属性。

在我在Web上看到的大多数教程和示例中,只使用了obtainStyledAttributes() 。 但是,这不适用于直接在布局中声明的属性,而不使用样式。 如果您按照大多数教程中所示获取了obtainStyledAttributes() ,则根本不会获得属性attrib1 ; 你将只获得attrib2因为它是在风格中声明的。 使用attr.getAttributeValue()的直接方法有效:

  public CustomView(Context context, AttributeSet attrs) { super(context, attrs); String attrib1 = attrs.getAttributeValue(null, "attrib1"); // do something with this value } 

由于我们没有使用命名空间来声明“ attrib1 ”,因此我们将null作为getAttributeValue()的namespaceparameter passing。

检查这个post 。

如果没有declare-styleable则无法创建新的自定义可绘制状态。