Как ответила Прия Сингхал, Android Studio требует, чтобы имена общих атрибутов были определены в их собственном имени стиля.Они больше не могут быть в корне.
Однако есть еще несколько моментов, на которые следует обратить внимание (поэтому я также добавляю ответ):
- Общеестили не должны называться так же, как представления.(Спасибо за этот ответ за указание на это.)
- Вам не нужно использовать наследование с родителем.
Пример
Вот что я сделал в недавнем проекте, который имеет два пользовательских представления, которые имеют одинаковые атрибуты.Пока пользовательские представления по-прежнему имеют имена атрибутов и не содержат 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>
Однако для большого проекта это может стать грязным, и лучше определить их в верхней части в одном месте (как рекомендовано здесь).