Ошибка пользовательского атрибута - 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>

также можете прочитать эту фантастическую статью среднего размера:один и тот же атрибут в нескольких пользовательских представлениях.

Другие вопросы по тегам