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