为什么android无法解析符号,但它仍然有效?

时间:2018-05-04 21:13:05

标签: android xml android-layout attributes cannot-find-symbol

我有一个FrameLayout,对点击有涟漪效应。要做到这一点,我在FrameLayout上有这个标记:

android:foreground="?attr/selectableItemBackgroundBorderless"

问题是我收到的错误是:"无法解析符号'?attr / selectableItemBackgroundBorderless'" 。尽管有错误,我仍然可以运行该项目,FrameLayout具有我想要的效果。

但如果我尝试使用此标签:

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

我收到另一个错误。它说这个标签需要API级别21。

所以我的问题是,这样做的正确方法是什么?我应该继续使用无法解析符号的那个并忽略错误吗?有没有其他方法可以与另一个标签有类似的行为?

6 个答案:

答案 0 :(得分:3)

  

?android:attr/selectableItemBackgroundBorderless表示超出视野的涟漪。它将被利用,并受其限制,   具有非空背景的视图的最近父级。

  • selectableItemBackgroundBorderless 是引入的新属性 API级别21

如果您想使用此功能,请打开 MODULE LEVEL build.gradle并设置

    compileSdkVersion 27
    buildToolsVersion "27.0.3"
    defaultConfig {
        applicationId "\\"
        minSdkVersion 21
        targetSdkVersion 27

确保在 google() PROJECT LEVEL部分添加 build.gradle

repositories {
        ....
        google() //maven { url 'https://maven.google.com' }
    }

<强>结构

<!-- Background drawable for borderless standalone items that need focus/pressed states. -->
 <attr name="selectableItemBackgroundBorderless" format="reference" />

注意

  

如果您的代码是故意访问更新的API,那么您有   确保(例如,通过条件执行)该代码将仅   永远在支持的平台上调用,然后你可以注释你的   使用@TargetApi注释指定本地的类或方法   要应用的最小SDK,例如@TargetApi(11),这样检查   考虑11而不是您的清单文件的最小SDK作为   所需的API级别。

XML,

android:foreground="?android:attr/selectableItemBackgroundBorderless"
tools:targetApi="lollipop"

欲了解更多信息,

答案 1 :(得分:2)

source code of support library appcompat-v7,您可以看到?attr/selectableItemBackgroundBorderless?android:attr/selectableItemBackgroundBorderless的别名:

<item name="selectableItemBackgroundBorderless">?android:attr/selectableItemBackgroundBorderless</item>

Android platform source code开始,您可以看到selectableItemBackgroundBorderless是平台版本21中添加的资源:

<public type="attr" name="selectableItemBackgroundBorderless" id="0x0101045c" />

当您使用以下内容时:

android:foreground="?attr/selectableItemBackgroundBorderless"

您正在使用支持库提供的资源。在我看来,错误是因为Android Studio试图知道在21以下的api中找不到的原始资源。由于找不到原始资源,它将回退到支持库提供的资源。

答案 2 :(得分:0)

不要直接分配android:foreground,而是让FrameLayout使用样式:

<FrameLayout 
    style="@style/MyStyle"
    ....>

res/values/styles.xml上,添加以下内容:

<style name="MyStyle">
    <item name="android:foreground">?attr/selectableItemBackgroundBorderless</item>
</style>

然后在res/values-v21/styles.xml上添加带有android:前缀的符号:

<style name="MyStyle">
    <item name="android:foreground">?android:attr/selectableItemBackgroundBorderless</item>
</style>

答案 3 :(得分:0)

android:foreground="?android:attr/selectableItemBackgroundBorderless"仅用于api 21或更高版本。如果您需要app-compat版本,则应删除android部分。 (您也可以删除attr部分,这相当于不删除它)。

以下两种方法都适用于低于21的api,并且完全相同:

android:foreground="?attr/selectableItemBackgroundBorderless"

android:foreground="?selectableItemBackgroundBorderless"

答案 4 :(得分:0)

这对我很有帮助:

  1. 在Android Studio中打开您的项目。
  2. 构建 - &gt;清洁项目。
  3. 打开项目目录。
  4. 删除以下目录:.idea,.gradle
  5. 返回Android Studio。
  6. 文件 - &gt;无效缓存/重新启动... - &gt;无效并重新启动。
  7. 文件 - &gt;使用Gradle文件同步项目
  8. 希望这会对你有所帮助。

答案 5 :(得分:-1)

将其设置为android:background="?android:attr/selectableItemBackground"