我已经开始在我的 android 应用程序中使用样式等,并且到目前为止我已经完成了所有工作。我非常了解指南的“风格”部分。
但是,环顾四周,就像在这个线程中一样,我真的无法弄清楚两者之间的区别(declare-stylable
和style
)。据我了解declare-styleable
,获取其中指定的属性并将其指定为可样式化,然后根据需要从代码中对其进行更改。
但如果这是它真正的作用,那么在布局中定义属性不是更简单吗?或者声明一个指定它的样式?
我认为将属性声明为可样式化与否之间只有以下区别。
在 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"/>
您可以在声明中使用“styleable”属性“attrib2” style.xml
。同样,这里不需要命名空间(即使在布局 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"/>
让我们假设我们这样做:我们attrib1
直接在 XML 中设置,并且我们attrib2
在样式中设置。
在其他地方,我看到说明“ blahblah
”必须是使用这些属性的自定义视图类的名称,并且您需要使用命名空间来引用布局 XML 中的自定义属性。但这似乎都不是必需的。
styleable 和 non-styleable 之间的区别似乎是:
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()
.
检查这个线程。
没有declare-styleable
它就不可能创建一个新的自定义可绘制状态。