安卓无法解析符号“?attr/selectableItemBackground”

55
<android.support.v7.widget.CardView
    android:id="@+id/card_view"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_marginLeft="@dimen/card_outer_padding"
    android:layout_marginTop="@dimen/card_outer_padding"
    android:layout_marginRight="@dimen/card_outer_padding"
    android:layout_marginBottom='@{model.cardBottomMargin}'
    android:foreground="?attr/selectableItemBackground"
    android:onClick="@{model::onCardClick}"
    app:cardElevation="2dp"
    app:cardCornerRadius="2dp"
    app:cardUseCompatPadding="true">
</android.support.v7.widget.CardView>

我收到了以下错误信息:

无法解析符号 ?attr/selectableItemBackground, 验证Android XML文件中的资源引用。

<TextView
    android:id="@+id/country_name"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_marginRight="40dp"
    android:text="@{model.name}"
    style="@style/TextAppearance.AppCompat.Headline"
    tools:text="Country"/>

我遇到了类似的错误:

无法解析符号'@style/TextAppearance.AppCompat.Headline'。
验证Android XML文件中的资源引用。

有什么指针吗? 谢谢!
它似乎与这个主题有关,但没有提供解决方案。

10个回答

143

我认为这是IDE和Android Gradle插件之间的通讯问题,无论如何,我可靠地找到了解决方法,就是在.idea/libraries/文件夹中删除有问题的libs

因此,对于你来说,由于lint检查无法识别?attr/selectableItemBackground

  1. 找到Gradle__com_android_support_xxx.xml文件
  2. 删除这些文件
  3. 使用文件系统同步IDE
  4. 使用Gradle文件同步项目
  5. 重新构建你的项目

您可以通过点击工具栏顶部的“文件”,然后选择“与文件系统同步”,然后再选择“使用gradle文件同步项目”进行同步。

我尝试过其他建议的解决方案 - 在我的模块build.gradle文件中使用appcompat-v7依赖项和将google()存储库作为项目build.gradle依赖项中的第一行。都没有效果。

这些解决方案也没有帮助...

  • 清除缓存/重启无效。
  • 清理/重新构建项目。

8
жҲ‘е’Ң?attr/colorPrimaryжңүзұ»дјјзҡ„й—®йўҳпјҢдҪҶжҳҜеҲ йҷӨзүҲжң¬еҸ·дёәxxxзҡ„Gradle__com_android_support_xxx.xmlж–Ү件еҜ№жҲ‘дёҚиө·дҪңз”ЁпјҢжүҖд»ҘжҲ‘еҲ йҷӨдәҶжүҖжңүд»ҘGradle__com_android_support_ејҖеӨҙзҡ„ж–Ү件пјҢиҝҷж ·е°ұеҸҜд»ҘдәҶгҖӮ - HendraWD
2
我找不到Gradle__com_android_support_xxx.xml文件。 - Dheeraj Rijhwani
1
没帮助...嗯...我已经尝试了几乎所有的方法 :) - Demigod
1
在Ubuntu上完全没有帮助,也尝试了HendraWD的解决方案。 - jeff
这对我很有帮助。最后,我只是删除了.idea文件夹中的整个库文件夹,以确保我没有忘记删除任何特定的文件,并使用Invalidate/Restart重新启动。构建所需的时间比平常多了一倍,但问题已经解决了。 - Wout
显示剩余6条评论

43

对于 Lollipop 及更高版本,请使用以下内容:

android:foreground="?android:attr/selectableItemBackground"

对于安卓5.0以下版本,请使用以下方法:

android:foreground="?attr/selectableItemBackground"

7
大多数情况下,这不是正确的解决方案。请您向读者解释一下差异以及为什么一个可能有效而另一个可能无效,以及每个选择的含义。如果您了解这一点,那么您肯定不会告诉人们,在这种情况下,解决方案是在属性前面添加“android”。 - Martin Marconcini
2
这不是最好的解决方案,因为它会强制前景成为平台指定的内容。因此,在Android 4.0上,这将是一个holo主题的selectableItemBackground。大多数人想使用AppCompat定义的资源,这需要您删除android前缀。 - Jawnnypoo
1
亲爱的Downvoter和@MartinMarconcini,正如我在之前的编辑中提到的,我已经尝试过并且对我有效。如果您或其他人知道确切的原因,请随时进行编辑并添加所需的信息,我将不胜感激。 - Vishal Yadav
1
我不知道是谁给这个帖子点了踩,但我要重申一遍:这不是提出问题的解决方案。这就像用 if (x != null) 修复空指针异常一样。问题深层次地存在于 Android 上主题/样式/属性的工作方式以及 Google 尝试通过博客文章来解释其簇杂的解决方案。所有的 Android 开发人员都能轻松理解主题、样式、属性之间的区别,以及如何应用它们并在不同平台版本中呈现吗?我敢打赌答案是否定的。甚至我自己也不知道所有的区别。 - Martin Marconcini
是的,OP找不到样式,但是告诉他使用“android”来代替,我相信(这也是我留言的原因),如果您知道/可以,应该尝试解释一下为什么会起作用,为什么会有两个版本,在您的经验中,必须注意哪些副作用。就这样。如果这对您的项目有效,则可以使用,但是作为读者,我不知道您的项目主题/API级别,因此可能不适用。 - Martin Marconcini
最后,我希望你能理解我的观点,但OP的问题是一个缺少属性的问题,因为在棒棒糖版本之前没有这个属性,即使你在后棒棒糖世界中,非android前缀版本也不可能找不到,除非有其他问题。你的解决方案是正确的,可以为不同的API指定不同的值/布局,但需要注意其他副作用和事项(如App Compat覆盖主题以及应用主题/样式的方式,取决于你运行的平台等)。所以你看,事情比表面上看起来要复杂得多。 - Martin Marconcini

9

有两个选项:

选项一

Another possible reason is: Google's maven repository is not set for the build script.

Open your project's main build.gradle add this line:

buildscript {
    repositories {
        google()  <-- this
        // Be also sure that google() is before jcenter()
    }
}

Without this, it may not be able to download the Android Studio Gradle plugin 3.0+. It's not distributed in jCenter but in the Google's maven repository.

选项2

在项目的根目录下运行此命令,并重新同步项目。

Linux:

rm .idea/libraries/Gradle__com_android_support_*.xml

Windows:

del .idea\libraries\Gradle__com_android_support_*.xml


在allprojects.repositories中?还是在buildscript.repositories中? - HerberthObregon
在 buildscript.repositories 中。 - Demigod
删除 .idea\libraries\Gradle__com_android_support_*.xml 然后将 IDE 与文件系统同步,再将项目与 Gradle 文件同步,这对我有用。 - Däñish Shärmà

4

虽然我与 Kotlin 无关,但这也解决了我的问题。 - behelit
解决了我的问题。 - Kristy Welsh

3

这两个资源都是使用Android Support库定义的,因为这些符号无法被解析,所以看起来你缺少定义支持依赖项的步骤。

dependencies {
    compile "com.android.support:appcompat-v7:$androidSupportVersion"
}

2
我认为你不应该在这个库中使用“编译(compile)”,而应该使用“实现(implementation)”。 - The incredible Jan
是的,但以前只有“编译”。这取决于您使用的Gradle和插件版本。 - tynn

1

我通过以下方式解决了问题:

  • 在项目资源管理器中删除.idea文件夹。
  • 使缓存失效/重启。
  • 刷新Gradle项目。

0
在我的情况下,需要在buildscripts.repositories和allprojects.repositories中添加maven到build.gradle项目中。它应该是这样的:
google()
maven { url 'https://maven.google.com' }
jcenter()

0
这是解决我的方法:
  1. 关闭Android Studio
  2. 删除根项目目录中的.idea目录

enter image description here

  1. 重新导入项目

enter image description here


0

我将gradle版本更新到4.10.1,修复并重新导入后问题得到解决。在此之前,.idea文件夹下没有libraries文件夹。


0

如果你在 LayoutInflater 中使用了 applicationContext,那么请将其替换成普通的 context。这对我有用。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接