Як відповіла Прия Сінгал, Android Studio вимагає, щоб загальні імена атрибутів були визначені в межах власного імені стилю. Вони вже не можуть бути в корені.
Однак слід зазначити ще пару речей (саме тому я також додаю відповідь):
- Загальні стилі не повинні називати те саме, що і вид. (Завдяки цій відповіді, що вказав на це.)
- Вам не потрібно використовувати спадщину з батьком.
Приклад
Ось що я зробив у недавньому проекті, який має два власні представлення, які мають однакові атрибути. Поки користувацькі представлення все ще мають назви атрибутів і не містять a format
, я все одно можу отримати доступ до них як звичайний з коду.
<?xml version="1.0" encoding="utf-8"?>
<resources>
<!-- common attributes to all custom text based views -->
<declare-styleable name="TextAttributes">
<attr name="text" format="string"/>
<attr name="textSize" format="dimension"/>
<attr name="textColor" format="color"/>
<attr name="gravity">
<flag name="top" value="48" />
<flag name="center" value="17" />
<flag name="bottom" value="80" />
</attr>
</declare-styleable>
<!-- custom text views -->
<declare-styleable name="View1">
<attr name="text"/>
<attr name="textSize"/>
<attr name="textColor"/>
<attr name="gravity"/>
</declare-styleable>
<declare-styleable name="View2">
<attr name="text"/>
<attr name="textSize"/>
<attr name="textColor"/>
<attr name="gravity"/>
</declare-styleable>
</resources>
Упорядкований приклад
Насправді мені навіть не потрібно ставити атрибути під власною назвою. Поки я визначаю їх (даю їм format
) принаймні один спеціальний вид, я можу їх використовувати в будь-якому місці (без цього format
). Тож це також працює (і виглядає чистіше):
<?xml version="1.0" encoding="utf-8"?>
<resources>
<declare-styleable name="View1">
<attr name="text" format="string"/>
<attr name="textSize" format="dimension"/>
<attr name="textColor" format="color"/>
<attr name="gravity">
<flag name="top" value="48" />
<flag name="center" value="17" />
<flag name="bottom" value="80" />
</attr>
</declare-styleable>
<declare-styleable name="View2">
<attr name="text"/>
<attr name="textSize"/>
<attr name="textColor"/>
<attr name="gravity"/>
</declare-styleable>
</resources>
Для великого проекту, однак, це може заплутатися, і визначення їх у верхній частині в одному місці може бути кращим (як тут рекомендується ).
myattr1
є рядок вMyView1
і ціле числоMyView2
?