У меня есть эта строка в моем макете account_particle.xml
android:padding = "?attrs/disc_padding"
этот attrs.xml:
<resources>
<declare-styleable name = "AccountParticle">
<attr name = "apStyle" format = "enum">
<enum name = "header" value = "0"/>
<enum name = "list_item" value = "1"/>
</attr>
<attr name = "text_margin_start" format = "reference"/>
<attr name = "text_margin_end" format = "reference"/>
<attr name = "text_margin_right" format = "reference"/>
<attr name = "text_margin_left" format = "reference"/>
<attr name = "disc_padding" format = "reference"/>
<attr name = "disc_imageViewSize" format = "reference"/>
</declare-styleable>
</resources>
и этот файл styles.xml:
<style name = "Theme.ap.header" parent = "Theme.AppCompat">
<item name = "disc_padding">@dimen/account_menu_header_signed_in_avatar_margin_start</item>
</style>
<style name = "Theme.ap.list_item" parent = "Theme.AppCompat">
<item name = "disc_padding">@dimen/account_menu_account_list_item_avatar_margin_start</item>
</style>
Почему я получаю эту ошибку компиляции?
error: Error: No resource found that matches the given name (at 'padding' with value '?attrs/disc_padding').
AccountParticle
но это на attrs.xml
Это просто имя файла. Фактический ресурс будет создан в классе R.attr. Фактически, не имеет значения, как вы назовете какой-либо файл в папках res/values*/ или в какой файл вы поместите туда какие-либо ресурсы; все они обрабатываются в соответствии со своим типом, например <attr>.
можешь написать это как ответ?
Конечно, я могу вставить это в ответ. Поскольку вы рассчитывали, что это будет attrs, это не просто опечатка. Дай мне минутку. Спасибо!
Проблема связана с использованием атрибутов, это должен быть ?attr/ вместо ?attrs/.
Но у вас есть другая проблема с вашим файлом attrs.xml. Проблема в том, что вы объявляете следующую ссылку внутри declare-styleable:
<attr name = "text_margin_start" format = "reference"/>
<attr name = "text_margin_end" format = "reference"/>
<attr name = "text_margin_right" format = "reference"/>
<attr name = "text_margin_left" format = "reference"/>
<attr name = "disc_padding" format = "reference"/>
<attr name = "disc_imageViewSize" format = "reference"/>
Эти ссылки следует вынести за пределы declare-styleable.
declare-styleable используется для определения группы attrs, которая будет использоваться в контексте настраиваемого представления. В вашем случае disc_padding используется вне контекста AccountParticle.
Ссылка на документацию: https://developer.android.com/training/custom-views/create-view#customattr
спасибо, но я имел в виду, что макет account_particle.xml
Правильный синтаксис для ссылки на значение атрибута темы в атрибуте макета:
prefix:attribute = "?attr/themeAttribute"
То есть attr вместо attrs.
Хотя вы могли определить этот атрибут в файле с именем attrs.xml, имя файла на самом деле не имеет значения. При создании ресурсов обрабатывается каждый файл в папке res/values*/, независимо от имени файла.
Фактически это означает, что вы можете называть свои файлы там как хотите, и вы можете помещать туда любые ресурсы в любой файл, какой захотите. Все они будут обрабатываться в соответствии со своим типом, например <attr>, <color>, <string> и т. д.
Опечатка. На
sнетattr. То есть должен бытьandroid:padding = "?attr/disc_padding".