Как ответила Прия Сингхал, 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>
Для большого проекта, однако, это может привести к путанице, и определение их сверху в одном месте может быть лучше (как рекомендуется здесь ).
myattr1
в строкеMyView1
и целое числоMyView2
?