Зачем нужно объявлять стиль, если вы можете просто напрямую читать из AttributeSet?

Я создал собственный подкласс View со следующим конструктором:

public MyCustomView(Context context, AttributeSet attrs)
{
    super(context, attrs);

    // get custom "thingy" attribute specified in XML
    int thingy = attrs.getAttributeIntValue(MY_NAMESPACE, "thingy", 0);

    //rest of constructor
    ...
}

Как видно, он берет пользовательский атрибут «thingy» из своих XML-атрибутов. Это работает абсолютно нормально, и до сих пор у меня не было проблем. Почему же тогда Google предлагает вам определить XML-атрибуты пользовательского представления в declare-styleable в res/values/attrs.xml (обсуждается здесь) и применить их, позвонив по телефону context.getTheme().obtainStyledAttributes() (обсуждается здесь)?


person XåpplI'-I0llwlg'I -    schedule 03.01.2013    source источник


Ответы (1)


Я тупой. Вторая ссылка, которую я разместил, действительно объясняет, почему:

Когда представление создается из макета XML, все атрибуты в теге XML считываются из пакета ресурсов и передаются в конструктор представления как AttributeSet. Хотя можно напрямую считывать значения из AttributeSet, это имеет некоторые недостатки:

  • Ссылки на ресурсы в значениях атрибутов не разрешаются
  • Стили не применяются

Вместо этого передайте AttributeSet в методgetStyledAttributes(). Этот метод возвращает массив значений TypedArray, которые уже были разыменованы и стилизованы.

person XåpplI'-I0llwlg'I -    schedule 03.01.2013