Android Studio标记R为红色并显示错误消息“无法解析符号R”,但构建成功。

158
在Android Studio中,我尝试创建的每个项目中,所有使用R的地方都会显示为红色,并显示错误消息“无法解析符号R”,但编译成功并且应用程序可以运行。这真的很烦人,因为它会阻止自动完成并在我的代码中显示巨大的红色波浪线。
我正在运行Android Studio 1.7.0,并使用默认设置创建项目。已附上屏幕截图: Android Studio Screenshot 这是我的build.gradle:
buildscript {
    repositories {
        mavenCentral()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:0.4'
    }
}
apply plugin: 'android'

dependencies {
    compile files('libs/android-support-v4.jar')
}

android {
    compileSdkVersion 17
    buildToolsVersion "17.0.0"

    defaultConfig {
        minSdkVersion 7
        targetSdkVersion 16
    }
}

这是项目结构的样子:

进入图像描述

有任何想法如何解决这个问题吗?


我在一些项目中遇到过这种情况。为了解决这个问题,我会执行“清理”、“重新生成”、关闭项目并重新打开,然后选择工具–>安卓–>与Gradle文件同步项目。我也尝试过以下方法… 关闭项目并将文件夹物理移动到新目录,或者重命名当前目录。现在导入该项目,就像它是新项目一样。有几种方法可以做到这一点,在初始的Android屏幕中,选择导入,当您找到目录时,不要从项目名称或主目录导入,而是在“应用程序”一级导入。 - Snappy Cracker
读者们,在尝试其他可能比较复杂的方法之前...不妨试着重新启动Android Studio。 - eRaisedToX
55个回答

113

只需在Android Studio中点击 构建 -> 重新构建项目选项即可。

但在某些情况下,我们可能还需要使用文件 -> 无效缓存...然后重新启动IDE(除了上述的重构建之外,因为先前的“无法解析符号”状态可能已被缓存)。

我们可以自动完成库,因为它们已经被构建,但是自己的项目需要先构建,然后Android Studio才能看到相关资源。

#1 需要重新构建,因为Android Studio不仅仅依赖Gradle的构建结果(至少在撰写本文时,即2022年)
(没有静态分析支持)。

#2 清除缓存可能是必需的,因为上一个构建结果(在上述重构建之前)可能已被索引,这可能会使Android Studio忽略最新的Gradle构建结果
(这是非常好的速度优化,但也是非常糟糕的开发者体验)。

有时候还可能有其他原因,这就是为什么这里发布了许多其他答案。


我有一个 .Jpg 图像,我将其更改为 .png 格式,但没有进行正确的转换。删除该文件解决了问题。不过这很奇怪。 - DeathRs
1
我非常想做这件事,但是Android Studio在构建方面很臭名昭著。如果我这样做,我的构建需要超过30分钟。 - Neon Warge
完美解决方案!! - Akash Bisariya
不得不做两次 - Janac Meena
有时是由于您的 XML 文件错误导致的。请检查这些 XML 文件中的以下行并进行更正。 - meyasir
只需在Android Studio中单击“Build”->“Clean Project”。 - Sumit Monapara

63

我发现这个问题是由于我的XML文件中存在错误导致的。一旦你修复了XML错误,进行一次清理/构建操作,它就会解决这个问题。


8
我会尽力帮助读者。很可能是XML文件中的某些内容导致了错误。对我而言(不确定为什么),但这个问题是由一个片段布局行引起的:android:layout_bottom="@id/my_list"。只需从该片段切换到另一个片段并使用layout_top即可解决问题,不必改变原来的意思。 - Mingsheng
对我也是一样的!感谢你的帮助。 - Michael
一样!谢谢。 - user4875457
非常好的回答!谢谢。 - Berat Eyüboğlu
是的,在我的情况下:我的 XML 元素高度为 '50' 而不是 '50dp'。 - Krishna Raj Salim

44

点击 Build -> Rebuild Project,然后点击 Tools -> Android -> Sync Project with Gradle Files


2
这个可以。我在升级gradle版本后遇到了错误。 - jay
我的情况是:每次执行“clean”操作都会导致所有的“R”变成错误,而每次执行“build”操作都可以修复它,但这当然会使项目变得不干净。在遵循了这个答案之后,我终于可以在不出错的情况下清理项目了。 - talz
1
只是补充一下@user2284700的答案:在AS 3.1.3中,“Sync Project with Gradle Files”位于“文件”菜单下。 - BMU

38

确保您的AndroidManifest.xml中包名是正确的。当我的R.whatever被标记为红色时,这个方法对我很有帮助!

我还建议检查所有的gradle文件以确保这些包名是正确的。这不会使所有东西变成红色,但它将阻止您的gradle文件正常同步。


谢谢!我正在进行一个有关包重命名的小实验,结果忘了它... - tom

19

什么都不用做,只需要更新Android Studio即可解决我的问题!完美地工作。


1
我尝试了这里提到的所有解决方案。更新Android Studio解决了这个问题。 - Siva
1
谢谢你让我不再浪费更多时间在这上面。 - wmurmann

12

我曾经遇到'com.android.tools.build:gradle:3.3.1'的类似问题,尝试了上述所有解决方案都未奏效。实际上是build:gradle 3.3.1出了问题。我将其更改为3.2.1,然后问题就得到解决。

所以问题可能出在build:gradle版本上。


03.2019 这很有帮助。有趣的是,这只发生在我的一个项目上,而其他两个项目没有出现这种情况。现在我希望 Android Studio 的更新没有搞砸其他东西... - Martin Berger

9
  1. 选择“文件”>“项目结构”菜单选项。
  2. 在消息框上按下“确定”(项目结构更改不会更新build.gradle)。
  3. 在“项目设置”侧窗格上选择“模块”。
  4. 对于每个模块(项目),请检查“排除的文件夹”部分是否不包含“build”文件夹。如果是,请按“build”文件夹旁边的“x”按钮。
  5. 按“确定”

现在您应该可以看到“MyAppProject / MyApp / build / source”文件夹。其中应该包含“r”文件夹(其中生成R.java文件)。在这里,您应该在“debug”、“release”文件夹下方看到蓝色(如果您的build.gradle中有projectFlavour,则会在“”文件夹下)。在debug/release文件夹中应该包含您的应用程序的包名称,然后是一个包含所有资源ID的R.java文件。


1
这已经不相关了,但请注意我在那个文件夹中没有R.java文件,您可以在我回复Loïc的信息中看到。 - Ilya Kogan

8
  1. 重新构建项目。
  2. 如果(1)无效,请重启Android Studio/Eclipse。

如果以上两种方法都不起作用,请检查您的所有xml文件。当您的xml文件不正确时,会出现此错误。


在我的情况下,manifest.xml文件中有一个属性导致了问题。我熬了几个夜晚,直到发现并删除了这一行。该属性是android:fullBackupContent=""。 - Kingsley Ijike

6
由于某些原因,Android Studio在编辑器和编译器中使用不同的配置。如果编译器可以使用,那就很好。但是,如果编辑器无法使用(看到未解决的文件),则需要将一些目录添加到项目源中。例如,所有资源都应标记为“源”。
依次选择“文件”->“项目结构”,然后选择“模块”,再选择您的项目。选择“源”选项卡,在右侧找到您的资源目录,然后单击蓝色的“源”按钮。关闭所有并保存更改。
此外,您还需要确保build/source/r/debug也是源代码。在我的设备上,所有的 build/source/*/debug 都被标记为源代码。在主模块文件.iml中进行修改。
<?xml version="1.0" encoding="UTF-8"?>
<module external.system.id="GRADLE" type="JAVA_MODULE" version="4">
  <component name="FacetManager">
    <facet type="android" name="Android">
      <configuration>
        <option name="SELECTED_BUILD_VARIANT" value="debug" />
        <option name="ASSEMBLE_TASK_NAME" value="assembleDebug" />
        <option name="ALLOW_USER_CONFIGURATION" value="false" />
        <option name="MANIFEST_FILE_RELATIVE_PATH" value="/src/main/AndroidManifest.xml" />
        <option name="RES_FOLDER_RELATIVE_PATH" value="/src/main/res" />
        <option name="ASSETS_FOLDER_RELATIVE_PATH" value="/src/main/assets" />
      </configuration>
    </facet>
    <facet type="android-gradle" name="Android-Gradle">
      <configuration>
        <option name="GRADLE_PROJECT_PATH" value=":SherlockHolmes" />
      </configuration>
    </facet>
  </component>
  <component name="NewModuleRootManager" inherit-compiler-output="true">
    <exclude-output />
    <content url="file://$MODULE_DIR$">
      <sourceFolder url="file://$MODULE_DIR$/build/source/r/debug" isTestSource="false" />
      <sourceFolder url="file://$MODULE_DIR$/build/source/aidl/debug" isTestSource="false" />
      <sourceFolder url="file://$MODULE_DIR$/build/source/rs/debug" isTestSource="false" />
      <sourceFolder url="file://$MODULE_DIR$/build/source/buildConfig/debug" isTestSource="false" />
      <sourceFolder url="file://$MODULE_DIR$/build/res/rs/debug" isTestSource="false" />
      <sourceFolder url="file://$MODULE_DIR$/build/source/r/test" isTestSource="true" />
      <sourceFolder url="file://$MODULE_DIR$/build/source/aidl/test" isTestSource="true" />
      <sourceFolder url="file://$MODULE_DIR$/build/source/rs/test" isTestSource="true" />
      <sourceFolder url="file://$MODULE_DIR$/build/source/buildConfig/test" isTestSource="true" />
      <sourceFolder url="file://$MODULE_DIR$/build/res/rs/test" isTestSource="true" />
      <sourceFolder url="file://$MODULE_DIR$/src/debug/aidl" isTestSource="false" />
      <sourceFolder url="file://$MODULE_DIR$/src/debug/assets" isTestSource="false" />
      <sourceFolder url="file://$MODULE_DIR$/src/debug/java" isTestSource="false" />
      <sourceFolder url="file://$MODULE_DIR$/src/debug/jni" isTestSource="false" />
      <sourceFolder url="file://$MODULE_DIR$/src/debug/rs" isTestSource="false" />
      <sourceFolder url="file://$MODULE_DIR$/src/debug/res" isTestSource="false" />
      <sourceFolder url="file://$MODULE_DIR$/src/debug/resources" isTestSource="false" />
      <sourceFolder url="file://$MODULE_DIR$/src/main/aidl" isTestSource="false" />
      <sourceFolder url="file://$MODULE_DIR$/src/main/assets" isTestSource="false" />
      <sourceFolder url="file://$MODULE_DIR$/src/main/java" isTestSource="false" />
      <sourceFolder url="file://$MODULE_DIR$/src/main/jni" isTestSource="false" />
      <sourceFolder url="file://$MODULE_DIR$/src/main/rs" isTestSource="false" />
      <sourceFolder url="file://$MODULE_DIR$/src/main/res" isTestSource="false" />
      <sourceFolder url="file://$MODULE_DIR$/src/main/resources" isTestSource="false" />
      <sourceFolder url="file://$MODULE_DIR$/src/instrumentTest/aidl" isTestSource="true" />
      <sourceFolder url="file://$MODULE_DIR$/src/instrumentTest/assets" isTestSource="true" />
      <sourceFolder url="file://$MODULE_DIR$/src/instrumentTest/java" isTestSource="true" />
      <sourceFolder url="file://$MODULE_DIR$/src/instrumentTest/jni" isTestSource="true" />
      <sourceFolder url="file://$MODULE_DIR$/src/instrumentTest/rs" isTestSource="true" />
      <sourceFolder url="file://$MODULE_DIR$/src/instrumentTest/res" isTestSource="true" />
      <sourceFolder url="file://$MODULE_DIR$/src/instrumentTest/resources" isTestSource="true" />
      <excludeFolder url="file://$MODULE_DIR$/build/apk" />
      <excludeFolder url="file://$MODULE_DIR$/build/assets" />
      <excludeFolder url="file://$MODULE_DIR$/build/bundles" />
      <excludeFolder url="file://$MODULE_DIR$/build/classes" />
      <excludeFolder url="file://$MODULE_DIR$/build/dependency-cache" />
      <excludeFolder url="file://$MODULE_DIR$/build/exploded-bundles" />
      <excludeFolder url="file://$MODULE_DIR$/build/incremental" />
      <excludeFolder url="file://$MODULE_DIR$/build/libs" />
      <excludeFolder url="file://$MODULE_DIR$/build/manifests" />
      <excludeFolder url="file://$MODULE_DIR$/build/symbols" />
      <excludeFolder url="file://$MODULE_DIR$/build/tmp" />
    </content>
    <orderEntry type="jdk" jdkName="Android 4.2.2" jdkType="Android SDK" />
    <orderEntry type="sourceFolder" forTests="false" />
    <orderEntry type="library" name="Sherlock.aar" level="project" />
    <orderEntry type="library" name="SlidingMenu.aar" level="project" />
    <orderEntry type="library" name="support-v4-13.0.0" level="project" />
  </component>
</module>

项目IML

<?xml version="1.0" encoding="UTF-8"?>
<module external.system.id="GRADLE" type="JAVA_MODULE" version="4">
  <component name="FacetManager">
    <facet type="android-gradle" name="Android-Gradle">
      <configuration>
        <option name="GRADLE_PROJECT_PATH" value=":" />
      </configuration>
    </facet>
  </component>
  <component name="NewModuleRootManager" inherit-compiler-output="true">
    <exclude-output />
    <content url="file://$MODULE_DIR$">
      <excludeFolder url="file://$MODULE_DIR$/.gradle" />
      <excludeFolder url="file://$MODULE_DIR$/build" />
    </content>
    <orderEntry type="inheritedJdk" />
    <orderEntry type="sourceFolder" forTests="false" />
  </component>
</module>

黑魔法

不太确定这个,但我听说它可以起作用,虽然我相信它不应该改变任何东西。尝试在注释掉所有需要R的行之后编译和保存项目。然后当一切都没有红色时,再添加它们回去。奇怪的是你的构建/源代码没有生成。

此外,这个问题建议检查“编译器使用外部构建”。

Android Studio不为我的导入项目生成R.java

附注

还要确保在你的Java代码中没有import android.r;。从你展示的内容来看,一切似乎都很好。只是奇怪的是构建/源代码没有被创建。例如,我没有build/apk。也许你处于发布模式,它不会创建这些目录。


嗨,Loïc,我在问题中添加了项目结构的截图。正如您所看到的,整个“res”文件夹都被标记为“源”,而且我没有“build/source”目录。我应该创建它吗?如果是这样,怎么做? - Ilya Kogan
据我所知,构建/源目录应该在构建时创建。 Android Studio是一个“alpha”版本,带有许多奇怪的东西。 我有1.7.0_21。 一个想法是执行build / rebuild project。 如果您可以从命令行运行gradle,则可能会抛出一些在编辑器中未显示的错误。 - Loïc Faure-Lacroix
尽管项目可以成功编译和在设备上运行,但它并没有被创建。 - Ilya Kogan
IML文件看起来与您的非常相似,包括相同的包含和排除文件夹。即使该目录不存在,"file://$MODULE_DIR$/build/source/r/debug"也被包括在内。使用外部构建会导致其他问题(项目根本无法编译)。如何检查我是否处于发布模式? - Ilya Kogan

5
我通过以下方式解决了它:
1) Sync Project with gradle files
2) Build -> Clean Project
3) Build -> Rebuild Project
4) File -> Invalidate caches

//imp step
5) Check your xml files properly.

有一天,我的应用程序毫无缘由地崩溃了...到处都是错误...非常感谢!这非常有帮助! - JFreeman
1
祝福你,使缓存无效是唯一有用的方法。 - Kibi

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