在Eclipse上开发Android应用:R.java没有重新生成

312

我发现我的R.java从未更新,因此它不包含有关我的新资源的信息,所以我决定将其删除并认为Eclipse会生成一个新的。但是这没有发生,现在我没有R.java。如何重新生成?

我正在使用Windows 7。

来自评论中的一条信息:"执行Project -> Clean是导致我的问题的原因。清理操作会删除 R.java ...出于某种原因,插件无法再次生成该文件。"


清理无效后,我的解决方案是需要在SDK管理器中下载构建工具,然后重新启动系统。我使用的是ADT 22.3.0版本。 - Moradnejad
64个回答

301

我遇到了一个布局错误,导致一切都崩溃了。别慌,这就像你初学编程C语言时忘记加分号而生成了一百个错误那样。许多人惊慌失措,乱按按钮,使情况变得更糟。

解决方案

  • 确保 R. 链接到的任何内容都没有问题。 修复 XML 文件中的所有错误。如果 ADK 中有任何问题,R 将无法重新生成。
  • 如果你不小心在 activity 中输入了 import android.R请删除它
  • 运行 Project -> Clean。 这将删除并重新生成 R 和 BuildConfig。
  • 确保已勾选 Project -> Build Automatically。 如果没有,请通过 Menu -> Project -> Build Project 手动构建它。
  • 等待 几秒钟,直到错误消失。
  • 如果还不行,请删除 /gen/ 文件夹中的所有内容
  • 如果仍然不行,请尝试 右键单击项目 -> Android 工具 -> 修复项目属性
  • 检查你的 *.properties 文件(位于 app 文件夹的根目录中),确保其中的链接没有问题。
  • 右键单击你的 项目 > properties > Android。查看页面右侧的“项目构建目标”和“库”部分。你的 Build Target 应该与 AndroidManifest.xml 中的目标相匹配。因此,如果在 AndroidManifest 中设置为目标 17,则确保目标名称为 Android 4.2。如果你的 Library 在引用下面有一个 X,请删除并重新添加该库,直到出现绿色勾号。如果你移动了一些文件和文件夹,可能会出现这种情况。

R 不会重新生成怎么办

这通常发生在你有损坏的 XML 文件时。

  • 检查你的 XML 文件中的错误,主要是在 /res/ 文件夹内
  • 常见的位置是 /layout//values/,特别是如果你最近更改了其中一个。
  • 检查 AndroidManifest.xml。我发现经常更改字符串但忘记在 AndroidManifest.xml 中更改字符串名称。
  • 检查是否安装了 Android SDK Build-tools窗口 -> Android SDK 管理器 -> 工具 -> Android SDK Build-tools
  • 确保在更新 Android SDK Tools 时,也要更新 Android SDK Platform-toolsAndroid ADK Build-tools。如果它们不匹配,则构建会无声失败。
  • 如果找不到问题,请右键单击 /gen/ -> 从本地历史记录还原... -> 选中 R.java -> 点击还原。即使它没有解决问题,也会清除多余的错误,使问题更容易找到。

  • 21
    这应该是最佳答案! - john.k.doe
    6
    确实,这让我意识到我的环境仍需要更新工具。 - woodleg.as
    11
    这是我使用的解决方案:在Window菜单下进入Android SDK Manager,选择Tools选项卡,找到Android SDK Build-tools并安装。我已经点赞了。 - user529543
    1
    我阅读了数十个答案,只有这一个提到了检查 SDK Build-tools。当 Eclipse 提供下载并安装所有 Android 工具时,我盲目地让其执行。但它完全忽略了这一部分。 - Justin Aquadro
    1
    检查控制台,可能会给出需要修复的详细错误,然后你就可以构建了。这对我的情况有所帮助。 - david72
    显示剩余10条评论

    177

    这个网站 建议:

    如果你在项目上运行clean操作,它应该会重新生成所有生成的Java文件,即R.java。

    ...和...

    在Eclipse中,Project菜单下有一个选项Build Automatically。每次修改后构建R.java文件将有所帮助。Clean…选项也在Project下面。

    这个网站 提供了另一种解决方案。


    101
    执行“项目清理”导致了我的问题。清理操作会删除 R.java 文件……由于某种原因,插件没有重新生成该文件。 - Cerin
    7
    当我链接一个需要不同于我安装的Android支持API版本的库时,出现了这个弹窗。依赖关系无法工作,并且在此之后我的R没有被生成。正如其他人所说,它会显示在错误日志中,因此请检查那里。 - mikebabcock
    96
    如果res目录中有错误,R.java文件将不会重新生成。移除错误后,在我的情况下问题得到了解决 :) - JavaRunner
    1
    在我的情况下,我的图像文件名为default.png,这会阻止重新生成块R.java。将其更改为splash.png可以解决问题。似乎您不能使用几个保留字作为资源名称。 - LeonQiu
    1
    @JavaRunner,同样适用于AndroidManifest文件。 - hytromo
    显示剩余7条评论

    40

    我也遇到了同样的问题。当我检查时发现layout下XML资源的名称没有使用正确的命名规范,其中有一些大写字母。因此,我将其重命名为所有字母小写,然后问题得以解决。


    2
    谢谢...我太傻了,以为可以在我的布局名称中使用大写字母。 - Kevin
    也适用于我:控制台报告如下:[2010-09-22 16:19:40 - myproject] res\drawable-ldpi\downloadNow.png:无效的文件名:必须仅包含[a-z0-9_.]。 - sami
    1
    谢谢,这就是我的问题。我在布局文件夹中有一个带大写字母的 .xml 文件,导致整个 R.java 文件丢失/无法生成。唯一的方法是意识到命名规范不允许使用大写字母;没有生成错误信息。 - Lemmings19
    1
    在命名资源文件或属性时,请尝试像在Java中命名变量一样进行命名。R.class将资源(即id、drawable、xml文件名称)与公共静态最终常量相关联,因此放置“-”、“特殊字符”会导致停止生成R,因为这些符号可能具有其他算术意义。 - IronBlossom
    1
    是的,这就是我的问题所在。我的res/xml中的一个文件引用了一个不存在的布局文件,显然这会导致R.java未被生成,因此如果我运行Clean,就会导致缺少R.java,从而导致数百个导入错误... - Cerin
    在我的情况下,在 strings.xml 文件中,我写成了 didn't 而不是 didn\'t - AlexAndro

    28

    导致 R.class 突然丢失的一个原因是 XML 文件中存在错误。例如,当您添加名称带有大写字母的 XML 文件时,如 myCoolLayout.xml,这是不允许的。或者当您引用不存在的文件时等。


    17
    在Eclipse中,只需使用 "Project --> clean" 来清理项目。R.java文件将会自动 (重新) 创建。 如果由于某些原因无法正常工作:请确保您的layout.xml文件不包含错误。Eclipse在这里似乎有点有bug:有时它不会标记XML内部或包资源管理器中的错误。在这种情况下:在使用“clean”后查看“console”或“problems”视图。所有错误都应该在那里显示。修复它们并重新清理。 注意:没有必要修复由于缺少R文件而导致的错误!只需修复XML文件和其他项目错误,并使用clean即可。

    确保您的资源文件命名规范正确。@Masi,感谢您的提示,在清理后查看“控制台”中的错误信息对我很有帮助。 - Bharath Booshan

    10

    快速修复:

    在清单文件中的包名需要与/src文件夹中的包名相同,/gen文件夹的包将会自动重新生成。

    详细观察:

    观察/gen文件夹中的包名。在我的情况下,它与/src文件夹中的包名不同。

    清单文件中引用的包是/gen文件夹中的包。

    我试图在/gen文件夹中添加一个与/src文件夹名称相同的包,以查看是否解决了问题,但这并没有解决问题。然后我尝试删除与/src文件夹中包名不同的包名。一旦我删除它,这个与/src文件夹不对应的包就被重新创建了。

    由于清单文件中的包引用对应的是那个无意义重新创建且不符合/src文件夹中包的名称的包,因此我们需要将package = "oldPackage"重命名为package = "srcFolderPackage"


    9
    我曾经遇到了同样的问题,最终找到了原因:在strings.xml文件中,我没有保留<string name="app_name">program-name</string>这一行代码,而这行代码在创建新的Android项目时默认存在。我以为它只用于程序HelloWord,也就是原始程序。
    然而,AndroidManifest.xml引用了这个值,因此:
    =>编译错误;
    =>R.java文件未更新;
    =>ID无法识别…

    在string.xml文件中的这一行是:“<string name="app_name">程序名称</string>”。抱歉,我之前发布时遇到了问题。 - Glaux

    9

    在SDK构建工具ADT 22中,Android增加了构建机制。你只需要按照以下步骤操作。

    1. 更新Android SDK工具
    2. 更新Android SDK平台工具
    3. 更新Android SDK构建工具
    4. 将您的构建工具路径添加到路径变量中。(路径为YOUR DIRECTORY-PATH\android-sdk\build-tools)

    这将解决该问题。


    我的回答是唯一与问题相关的。仍然只有3个赞,很奇怪! - Mr.India

    8

    如果您的R.java文件没有生成,其中一个解决方案是删除名为“blabla.out.xml”的布局文件。

    删除此文件后,请尝试从菜单中清除项目Project -> Clean


    7
    作为对Glaux回答的概括,如果您在res目录中有任何错误,那么即使您进行清理和重建,R.java也可能无法生成。请先解决这些错误。
    例如:当您添加一个名为“myimage-2.jpg”的图像文件时,系统会认为这是一个错误,因为文件名仅限于字母数字值。在添加任何文件后,请刷新您的“res”目录,并查看控制台窗口中是否有文件名警告。

    没错!每当我在strings.xml中重命名字符串时,有时会发生这种情况。这可能会在我的布局文件中创建悬空引用。而那会阻碍R.java的生成。很遗憾没有办法重构XML ID。 - SMBiggs

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