Ошибка пользовательского атрибута - Android Studio 1.2
В моем проекте Android у меня есть несколько пользовательских компонентов, которые используют пользовательские атрибуты.
Файл attrs.xml выглядит так:
<?xml version="1.0" encoding="utf-8"?>
<resources >
<declare-styleable name = "TextBox">
<attr name = "font" format = "string"/>
</declare-styleable>
<declare-styleable name = "ButtonBox">
<attr name = "font" format = "string"/>
</declare-styleable>
</resources>
Я просто вытягиваю атрибуты в пользовательский компонент, но когда я запускаю код, я вижу следующую ошибку.
Ошибка: найден элемент Attr / font более одного раза
Ошибка: не удалось выполнить задачу ": app: mergeDebugResources".
Разве не должно быть разницы, что есть одинаковые имена атрибутов в двух разных объявляемых стилях, правильно?
Если у вас есть какая-либо помощь, она будет очень признательна, спасибо!
2 ответа
Как вы можете видеть здесь, сам attr может иметь несколько свойств и может быть определен только один раз, и вы можете настроить несколько деталей внутри него. Поэтому вы должны дать ему разные имена или, поскольку они имеют одинаковые свойства, использовать только одно declare-styable
для обоих.
Проверьте эту ссылку тоже, есть хороший пример.
Вот как это должно быть:
<?xml version="1.0" encoding="utf-8"?>
<resources >
<declare-styleable name="Box">
<attr name="font" format="string"/>
</declare-styleable>
</resources>
Ты можешь использовать Box
на тексте, кнопке и т. д.
Android — Пользовательские представления: один и тот же атрибут в нескольких пользовательских представлениях
Возможно, вы пробовали что-то вроде приведенного ниже кода в файле attrs.xml:
'''
<resources>
<declare-styleable name="MyComponent1">
<attr name="myAttr" format="string" />
</declare-styleable>
<declare-styleable name="MyComponent2">
<attr name="myAttr" format="string" />
</declare-styleable>
</resources>
'''
Но это не работает, и мы получаем Error: Found item Attr/myAttr более одного раза.
Как нативные представления справляются с этим? Собственные представления имеют те же имена атрибутов и не страдают от этой проблемы. Давайте проникнем в их код и посмотрим, как объявляются эти атрибуты.
Глядя в их код, мы видим, что они создают тег attr снаружи declare-styleable, а затем внутри него вам просто нужно ссылаться на него только по его имени, нет необходимости снова объявлять формат.
Наш код должен быть именно таким:
<resources>
<attr name="myAttr" format="string" />
<declare-styleable name="MyComponent1">
<attr name="myAttr" />
</declare-styleable>
<declare-styleable name="MyComponent2">
<attr name="myAttr" />
</declare-styleable>
</resources>
также можете прочитать эту фантастическую статью среднего размера:один и тот же атрибут в нескольких пользовательских представлениях.