Как создать набор атрибутов из style.xml?

Вот моя история:

У меня есть пользовательская группа ViewGroup, которую я хочу создать из кода с использованием предопределенного стиля, мой подход до сих пор создавал объект AttributeSet из элемента style.xml, вроде этого (предупреждение, остерегайтесь кода копирования-вставки впереди ):

    XmlPullParser parser = getResources().getXml(R.style.my_stylez);
    AttributeSet attributes = Xml.asAttributeSet(parser);

Но при этом я получаю сумасшедшую ошибку: "..android.content.res.Resources $NotFoundException: Идентификатор ресурса # 0x7f090002 type # 0x12 недействителен"

Я знаю, что я, вероятно, пропустил что-то очень очевидное здесь (или я?), и был бы признателен, если кто-нибудь из вас, ребята, может указать мне в правильном направлении.

Спасибо

Ответы

Ответ 1

Вам нужно начать с идентификатора ресурса для XML файла, предпочтительно в res/xml. Затем вы можете получить AttributeSet, сначала создав XmlPullParser:

Resources res = context.getResources();
XmlPullParser parser = res.getXml(R.xml.some_xml_file);

// Seek to the first tag.
int type = 0;
while (type != XmlPullParser.END_DOCUMENT && type != XmlPullParser.START_TAG) {
    type = parser.next();
}

// Wrap as an attribute set.
AttributeSet attrs = Xml.asAttributeSet(parser);

Вы можете найти примеры этого в доступных тестах CTS в AOSP.

Ответ 2

Похоже, что ваш XML (R.style.my_stylez) не существует, или ваш R файл устарел.

Ответ 3

Всякий раз, когда вы делаете новые дополнения к каталогу res, это хорошая идея для очистки и сборки проекта. Но с ADT 15 это не всегда хорошо работает. Иногда вам нужно сделать еще один шаг и удалить каталог bin, а также каталог gen.

После того как adt воссоздает эти два каталога, попробуйте снова запустить очистку.

Ответ 4

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

Ответ 5

Метод getXml будет читать из res/xml, а не из res/values, я думаю, идея состоит в том, что вы используете один из других методов для получения данных, например

TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.MyCustomTheme);

а затем захватить значения из TypedArray:

thingColor = a.getColor(R.styleale.myCustomColor, res.getColor(R.color.myDefaultColor));

Это работает для стилей, однако моя проблема заключается в том, что атрибуты AttributeSet из XML в первую очередь используются в качестве переопределений и позволяют людям указать, какой XML файл они хотят во время выполнения, раздуть его в AttributeSet и передать его.

Я отправлю ответ, когда у меня будет ответ для второй части, но образцы кода должны решить