Я создал собственный виджет и объявляю его в 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.
android
android-layout
android-xml
android-styles
styler1972
источник
источник
cutsom:xmlns=...
?? не должно бытьxmlns:cutsom=...
?Ответы:
Я понял! Ответ - НЕ указывать пространство имен в стиле.
источник
declare-stylable
вместо перечисления. Я не уверен, почему перечисления не работали, но этот обходной путь был достаточно хорош для меня.Приведенный выше ответ работает для меня, я попробовал небольшое изменение, я объявляю styleable для класса в элементе ресурсов.
в возвещайте-styleable , то имя атрибута ссылается имя класса, так что я имел вид класса вызов «com.my.package.name.VerticalView», он представлял это DECLARE должно быть использование в VerticalView или подклассов VerticalView. поэтому мы можем объявить стиль следующим образом:
вот почему мы не объявили пространство имен в элементе ресурсов, оно все еще работает.
источник
Значения / styles.xml
Значения / attrs.xml
Значения / colors.xml
Значения / dimens.xml
С помощью
DEMO
источник
Модификация Стилера и Винса сработала для меня. Я хотел отметить, что объяснение @ vince может быть не совсем точным.
Чтобы проверить гипотезу о том, что атрибут name,
declare-styleable
совпадающий с именем пользовательского класса представления, позволяет нам получить доступ к пользовательскому атрибуту без пространства имен, я изменил имяdeclare-styleable
(пользовательское представление было названоTestViewFont
:Затем я изменил
obtainStyledAttributes
вызов в пользовательском представлении, чтобы отразить это:Код все еще работает. Так что я не думаю, что это какой-то самоанализ
declare-styleable
класса, в честь которого он назван.Таким образом, меня убеждают, что любые пользовательские атрибуты могут использоваться для объявления стиля без обращения к пространству имен.
Несмотря на это, спасибо за помощь, ребята, это решило мою проблему.
источник
declare-styleable
блоке или нет. (извините, я не могу найти справочную страницу для этого ...) За исключением атрибутов изandroid
пространства имен, вы должны указывать только имя атрибута.Определите некоторые атрибуты
Используйте его в файле макета, как
Наконец, используйте его в файле стиля
Разница между файлом стиля и файлом макета в том, что мы не добавляем prefiexapp:
Попробуйте, хорошего дня, это работает для меня.
источник
В случае, если это поможет кому-то еще, моя ошибка состояла в том, что мой класс пользовательского представления вызывал AttributeSet.getAttributeValue, например
... что привело к тому, что мой пользовательский атрибут не был прочитан для моего пользовательского представления.
Исправление было использовать
obtainStyledAttributes
в моем пользовательском представлении:Намек на то, что это работает правильно, заключается в том, что вы можете нажать Ctrl / Apple +, нажав на
R.styleable.MyTextViewStyleable_customFont
чтобы перейти прямо к определению attrs.xml.Мне потребовалось некоторое время, чтобы обнаружить это критическое различие между моим кодом и другими примерами, так как пользовательский атрибут работал нормально, когда передавался напрямую через XML макета (а не через стиль).
источник