Разница между объявлением стиля и стиля - PullRequest
23 голосов
/ 03 января 2011

Я начал играть со стилями и тому подобным в своих приложениях для Android, и у меня все работает до сих пор.Я вполне понял раздел 'style' в руководстве .

Но, оглядываясь вокруг, как в этой теме , я не могу понять разницу междудва (declare-stylable и style).Насколько я понимаю, declare-styleable берет атрибут, указанный в нем, и определяет его как стилизуемый, а затем из кода каждый меняет его так, как ему хочется.

Но если это то, что он действительно делает, не будетпроще просто определить атрибут в макете?Или объявить стиль, указав его?

Ответы [ 2 ]

59 голосов
/ 03 февраля 2012

Я думаю, что есть только следующая разница между объявлением атрибута как стилевого или нет.

В 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().

2 голосов
/ 03 января 2011

Отметьте это thread .

Без declare-styleable было бы невозможно создать новое пользовательское состояние рисования.

...