Атрибуты с тем же именем в 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"/>

Другие вопросы по тегам