error: Error: No resource found that matches the given name (for attribute reference)

error: Error: No resource found that matches the given name (for attribute reference)

我的 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

问题与属性用法有关,它应该是 ?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_paddingAccountParticle.

的上下文之外使用

文档参考:https://developer.android.com/training/custom-views/create-view#customattr

在布局属性中引用主题属性值的正确语法是:

prefix:attribute="?attr/themeAttribute"

attr而不是attrs

虽然您可能已经在名为 attrs.xml 的文件中定义了该属性,但文件名实际上是无关紧要的。构建资源时,将处理 res/values*/ 文件夹下的每个文件,无论文件名如何。

这实际上意味着您可以在那里随意命名文件,并且可以将任何资源放在您想要的任何文件中。它们都会根据它们的类型进行处理,如<attr><color><string>