Атрибуты с тем же именем в attrs.xml для пользовательского просмотра - PullRequest
150 голосов
/ 14 декабря 2010

Я пишу несколько пользовательских представлений, которые имеют некоторые одноименные атрибуты. В соответствующем разделе <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 ]

341 голосов
/ 16 декабря 2010

Решение: Просто извлеките общие атрибуты из обоих представлений и добавьте их непосредственно как дочерние элементы узла <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>
41 голосов
/ 12 октября 2015

Я публикую этот ответ, поскольку вышеприведенное решение не помогло мне в 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 соответственно.

22 голосов
/ 18 февраля 2017

Как ответила Прия Сингхал, 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>

Однако для большого проекта это может стать грязным, и лучше определить их в верхней части в одном месте (как рекомендовано здесь).

7 голосов
/ 04 января 2017

Спасибо, Льюис, у меня возникла та же проблема, и ваше решение по наследованию дало мне подсказку сделать это, как показано ниже, и оно работает нормально. Я просто объявил общие атрибуты выше и переписал их в теле объявления стиля снова без форматирования.Я надеюсь, что это помогает кому-то

<?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>

1 голос
/ 09 августа 2016

На всякий случай, если кто-то все еще сталкивается с этой проблемой после того, как попробовал доступное решение Я застрял с добавлением атрибута subtitle в формате string.

Мое решение - удалить формат.

перед:

<attr name="subtitle" format="string"/>

после

<attr name="subtitle"/>

...