Подтвердить что ты не робот

Разница между объявлением и стилем

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

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

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

4b9b3361

Ответ 1

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

В 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

Отметьте thread.

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