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

时间:2011-01-03 15:38:48

标签: android styles declare-styleable

我已经开始玩我的Android应用程序中的样式等了,到目前为止我已经完成了所有工作。我完全理解'风格'section of the guide

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

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

2 个答案:

答案 0 :(得分:59)

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

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

<?xml version="1.0" encoding="utf-8"?>
<resources>
   <attr name="attrib1" format="string" />
 <declare-styleable name="blahblah">
    <attr name="attrib2" format="string" />
 </declare-styleable>

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

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

<com.custom.ViewClass  attrib1="xyz" attrib2="abc"/>

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

 <style name="customstyle" parent="@android:style/Widget.TextView">
    <item name="attrib2">text value</item>
    <!--  customize other, standard attributes too: -->
    <item name="android:textColor">@color/white</item>
 </style>

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

<com.custom.CustomView attrib1="xyz" style="@style/customstyle"/>

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

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

样式和非样式之间的区别似乎是:

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

在我在网上看过的大多数教程和示例中,只使用了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()中的命名空间参数传递。

答案 1 :(得分:2)

选中thread

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