Атрибуты с тем же именем в attrs.xml для пользовательского просмотра
Я пишу несколько пользовательских представлений, которые имеют некоторые одноименные атрибуты. В их соответствующих <declare-styleable>
раздел в attrs.xml
Я хотел бы использовать те же имена для атрибутов:
<?xml version="1.0" encoding="utf-8"?>
<resources>
<declare-styleable name="MyView1">
<attr name="myattr1" format="string" />
<attr name="myattr2" format="dimension" />
...
</declare-styleable>
<declare-styleable name="MyView2">
<attr name="myattr1" format="string" />
<attr name="myattr2" format="dimension" />
...
</declare-styleable>
</resources>
Я получаю сообщение об ошибке, говорящее, что myattr1
а также myattr2
уже определены. Я обнаружил, что я должен опустить format
атрибут для myattr1
а также myattr2
в MyView2
, но если я это сделаю, я получу следующую ошибку в консоли:
[2010-12-13 23:53:11 - MyProject] ERROR: In <declare-styleable> MyView2, unable to find attribute
Есть ли способ, которым я мог бы сделать это, может быть, какое-то пространство имен (просто угадать)?
5 ответов
Решение: просто извлеките общие атрибуты из обоих представлений и добавьте их непосредственно как дочерние элементы <resources>
узел:
<?xml version="1.0" encoding="utf-8"?>
<resources>
<attr name="myattr1" format="string" />
<attr name="myattr2" format="dimension" />
<declare-styleable name="MyView1">
<attr name="myattr1" />
<attr name="myattr2" />
...
</declare-styleable>
<declare-styleable name="MyView2">
<attr name="myattr1" />
<attr name="myattr2" />
...
</declare-styleable>
</resources>
Я публикую этот ответ, так как вышеприведенное решение не помогло мне в Android Studio. Мне нужно поделиться своими пользовательскими атрибутами среди своих пользовательских представлений, поэтому я попробовал вышеуказанное решение в Android Studio, но безуспешно. Так что я экспериментирую и иду способ сделать это. Надеюсь, что это может помочь кому-то, кто ищет ту же проблему.
<?xml version="1.0" encoding="utf-8"?>
<resources>
<!-- parent styleable -->
<declare-styleable name="MyView">
<attr name="myattr1" format="string" />
<attr name="myattr2" format="dimension" />
</declare-styleable>
<!-- inheriting parent styleable -->
<!-- also note "myBackgroundColor" belongs to child styleable"MyView1"-->
<declare-styleable name="MyView1" parent="MyView">
<attr name="myattr1" />
<attr name="myattr2" />
<attr name="myBackgroundColor" format="color"/>
</declare-styleable>
<!-- inheriting parent styleable -->
<!-- same way here "myfonnt" belongs to child styelable "MyView2" -->
<declare-styleable name="MyView2" parent="MyView">
<attr name="myattr1" />
<attr name="myattr2" />
<attr name="myfont" format="string"/>
...
</declare-styleable>
</resources>
Это работает для меня полностью. Нам нужно сделать родительский стиль стилевым, а затем нам нужно наследовать этот родительский стиль. Например, как я уже делал выше: родительское стилевое имя MyView и унаследовало его от других моих стилей, таких как MyView1 и MyView2 соответственно.
Как ответила Прия Сингхал, 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>
Тем не менее, для большого проекта это может привести к путанице, и определение их сверху в одном месте может быть лучше (как рекомендуется здесь).
Спасибо, Льюис, у меня была та же проблема, и ваше решение по наследованию дало мне подсказку сделать это, как показано ниже, и оно работает нормально. Я просто объявил общие атрибуты выше и переписал их в теле объявления стиля снова без форматирования. Я надеюсь, что это помогает кому-то
<?xml version="1.0" encoding="utf-8"?>
<resources>
<!-- common attributes -->
<attr name="myattr1" format="string" />
<attr name="myattr2" format="dimension" />
<!-- also note "myBackgroundColor" belongs to child styleable"MyView1"-->
<declare-styleable name="MyView1" >
<attr name="myattr1" />
<attr name="myattr2" />
<attr name="myBackgroundColor" format="color"/>
</declare-styleable>
<!-- same way here "myfonnt" belongs to child styelable "MyView2" -->
<declare-styleable name="MyView2" parent="MyView">
<attr name="myattr1" />
<attr name="myattr2" />
<attr name="myfont" format="string"/>
...
</declare-styleable>
На тот случай, если кто-то все еще застрял с этой проблемой после того, как попробовал доступное решение. Я застрял с добавлением subtitle
приписать с string
формат.
Мое решение - удалить формат.
до:
<attr name="subtitle" format="string"/>
после:
<attr name="subtitle"/>