2011-01-03 1 views
20

Я начал играть со стилями и т. Д. В своих приложениях для Android, и до сих пор все работало. Я вполне понял «стиль» section of the guide.Разница между declare-styleable и style

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

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

ответ

52

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

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

+0

потрясающий ответ. если бы мог, проголосую за него несколько раз. –

+0

точно, о чем моя проблема была, крутой ответ –

+0

чистое объяснение, прямо к делу. – VallaDanger

2

Проверьте это thread.

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

+0

Таким образом, разница в том, что declare-styleable дает вам возможность вводить новые атрибуты, с которыми вы можете делать магики, такие как состояния рисования (я думаю, для этого должны быть другие применения), а стиль просто группирует набор атрибутов уже существующий? Имеет смысл, спасибо. – Stephan

Смежные вопросы