Пользовательские атрибуты в styles.xml - PullRequest
170 голосов
/ 28 июля 2011

Я создал собственный виджет и объявляю его в layout.xml. Я также добавил несколько пользовательских атрибутов в attr.xml. Однако, когда я пытаюсь объявить эти атрибуты в стиле в styles.xml, это дает мне No resource found that matches the given name: attr 'custom:attribute'.

Я поместил xmlns:custom="http://schemas.android.com/apk/res/com.my.package" во все теги в styles.xml, включая <?xml>, <resources> и <style>, но все равно выдает мне ту же ошибку, что не может найти мой настраиваемое пространство имен XML.

Однако я могу использовать свое пространство имен, чтобы вручную назначить атрибуты для представления в моем layout.xml, так что с пространством имен все в порядке. Моя проблема заключается в информировании файла styles.xml о моем файле attr.xml.

Ответы [ 6 ]

352 голосов
/ 29 июля 2011

Я понял это!Ответ: НЕ указать пространство имен в стиле.

<?xml version="1.0" encoding="utf-8" ?>
<resources xmlns:android="http://schemas.android.com/apk/res/android">
    <style name="CustomStyle">
        <item name="android:layout_width">wrap_content</item>
        <item name="android:layout_height">wrap_content</item>

        <item name="custom_attr">value</item> <!-- tee hee -->
    </style>
</resources>
40 голосов
/ 07 мая 2013

ответ выше работает для меня, я пробовал небольшое изменение, я объявляю styleable для класса в элементе ресурсов.Атрибут name ссылался на имя класса, поэтому у меня был вызов класса представления "com.my.package.name.VerticalView", он представлял, что это объявление должно использоваться в VerticalView или подклассах VerticalView.поэтому мы можем объявить стиль следующим образом:

<resources>
    <style name="verticalViewStyle">
        <item name="android:layout_width">match_parent</item>
        <item name="android:layout_height">36dip</item>

        <item name="textSize">28sp</item>  <!-- not namespace prefix -->
        <item name="textColor">#ff666666</item>
        <item name="textBold">true</item>
    </style>
</resources>

, поэтому мы не объявили пространство имен в элементе ресурсов, оно все еще работает.

8 голосов
/ 30 октября 2013

Модификация Стилера и Винса сработала для меня. Я хотел отметить, что объяснение @ vince может быть не совсем точным.

Чтобы проверить гипотезу о том, что атрибут name declare-styleable, совпадающий с именем класса пользовательского представления, позволяет нам получить доступ к пользовательскому атрибуту без пространства имен, я изменил имя declare-styleable (пользовательское представление было названо TestViewFont

<declare-styleable name="TextViewFont2">
    <attr name="font" format="integer"/>
</declare-styleable>

Затем я изменил вызов obtainStyledAttributes в пользовательском представлении, чтобы отразить это:

TypedArray ta = context.getTheme().obtainStyledAttributes(attrs, R.styleable.TextViewFont2, 0, 0);

Код все еще работает. Поэтому я не думаю, что это какой-то самоанализ со стороны declare-styleable класса, в честь которого он назван.

Таким образом, меня убеждают, что любые пользовательские атрибуты могут использоваться для объявления стиля без ссылки на пространство имен.

Несмотря ни на что, спасибо за помощь, ребята, это решило мою проблему.

5 голосов
/ 22 декабря 2017

values ​​/ styles.xml

<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
    ...
    <item name="defaultButtonColor">@color/red</item>
    <item name="defaultButtonHeight">@dimen/dp_100</item>
</style>

values ​​/ attrs.xml

<resources>
    <attr name="defaultButtonColor" format="reference" />
    <attr name="defaultButtonHeight" format="reference"/>
</resources>

значения / цвета.xml

<resources>
    <color name="red">#f00</color>
</resources>

значения / размеры. xml

<resources>
    <dimen name="dp_100">100dp</dimen>
</resources>

Использование

<Button
    android:layout_width="wrap_content"
    android:layout_height="?attr/defaultButtonHeight"
    android:text="Button"
    android:textColor="?attr/defaultButtonColor"
    />

enter image description here

DEMO

1 голос
/ 13 декабря 2014

В случае, если это поможет кому-то еще, моя ошибка заключалась в том, что мой пользовательский класс представления вызывал AttributeSet.getAttributeValue например,

String fontName = attrs.getAttributeValue("http://schemas.android.com/apk/res-auto", "customFont");

... что привело к тому, что мой пользовательский атрибут нечитается для моего пользовательского представления.

Исправление заключалось в использовании obtainStyledAttributes в моем пользовательском представлении:

 TypedArray styleAttrs = context.obtainStyledAttributes(attrs, R.styleable.MyTextViewStyleable);
 String fontName = styleAttrs.getString(R.styleable.MyTextViewStyleable_customFont);

Подсказка, что это работает правильно, заключается в том, что вы можете использовать Ctrl / Apple+ нажмите на R.styleable.MyTextViewStyleable_customFont, чтобы перейти непосредственно к определению attrs.xml.

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

0 голосов
/ 11 июля 2019
  • Определить некоторые атрибуты

<declare-styleable name="refreshPullRefreshLayout">
        <attr name="refreshColors" format="reference"/>
        <attr name="refreshColor" format="reference"/>
</declare-styleable>
  • Использовать его в файле макета, например

<com.aolphn.PullRefreshLayout
     app:refreshColor="@color/main_green"
     app:refreshColors="@array/refresh_color"/>
  • Наконец, используйте его в файле стиля

    Разница между файлом стиля и файлом макета в том, что мы не добавляем prefiex app:
<style name="refreshStyle">
    <item name="refreshColor">@color/main_green</item>
    <item name="refreshColors">@array/refresh_color</item>
</style>

Попробуй, хорошего дня, у меня это работает.

...