Я думаю, что есть только следующая разница между объявлением атрибута как стилевого или нет.
В 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 макета. Но, похоже, ничего из этого не нужно.
Разница между стилями и стилями заключается в том, что:
- Вы можете использовать настраиваемые атрибуты в объявлениях "
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()
.