R.java 文件背后的魔法

Posted

技术标签:

【中文标题】R.java 文件背后的魔法【英文标题】:Magic behind R.java file 【发布时间】:2011-01-04 03:22:04 【问题描述】:

最近我在使用 R.java 文件时遇到了一些问题。现在我决定做一个备份并删除文件,看看会发生什么。

什么都没有发生,所以我创建了一个空的 R.java 文件并希望一切顺利。现在 Eclipse 似乎发现文件被篡改了,甚至发出警告:

R.java was modified manually! Reverting to generated version!

仅此而已。我尝试手动构建它,但没有得到任何结果。

所以,我有两个问题:

    我应该怎么做才能强制 Eclipse 重新生成文件 这里发生了什么?文件是如何创建的,生成文件的代码在哪里?

如果有任何帮助,我将不胜感激。像往常一样,问题发生在截止日期前几天:)

【问题讨论】:

【参考方案1】:

我在编译我的 android 应用程序时遇到了问题,出现了关于无法生成 R.java 的看似莫名其妙的错误。

问题是由于我之前在构建过程中杀死了 Android 模拟器造成的。不要那样做!一个线索是出现了几个遗留的 *.out.xml 文件。

解决方法是选择项目,点击Project->Clean,然后手动删除所有*.out.xml文件。只有这样我才能单击 Run->Run 并成功构建。

还有一件事:我正在使用 Eclipse。我必须确保在包资源管理器中选择了该项目,并且只是一些随机源文件。容易被忽视!

【讨论】:

【参考方案2】:

R.java 在构建时自动生成。它的内容基于资源文件(包括布局和首选项)。

当你删除它时,它会被重新创建,但如果你自己创建它,你会遇到麻烦,因为构建系统不会替换它。

您可以简单地再次删除它(手动或通过选择 Project->Clean)并重新构建您的程序。

【讨论】:

这正是我所做的 - 首先我删除了文件,但 eclipse 甚至没有检测到它已经消失。只有在我创建了一个空的 R.java 类之后,它才检测到有问题,但它不会重新创建或以任何方式修改文件。【参考方案3】:

我多次遇到这个问题,而且大多数情况下是由“res”文件中的一些错误引起的,检查所有 res 文件中的一切是否正常,主要是 XML,然后才能构建。

例如,此问题的两个常见原因可能是:

在 XML 文件的样式中没有正确拼写属性的名称。

没有正确关闭语言环境文件 XML 中的字符串。

【讨论】:

【参考方案4】:

我发现了问题 - 我创建了一个 9patch 图像,其中仅在 Y 轴上定义了补丁区域(我试图阻止在另一个上调整大小)。

问题仍然存在:为什么没有关于错误的警告?或者如果有 - 它被埋在哪里?

【讨论】:

关于 9-patch 的错误应该已经出现在“问题”窗口中。 它可能存在于某个地方,但是当我将它添加到项目中时它崩溃了 R.java 并且一切都变红了,所以有点难以注意到。【参考方案5】:

抱歉,请尝试检查 Eclipse 中的输出。可能是您有一些错误阻止 Eclipse 完成构建过程(检查您的 AndroidManifest.xml,是否正确?)。我的意思是,您应该检查所有资源文件(string.xml,布局,...)和接口(*.aidl),可能是有一些问题(语法不一致,或者什么....)阻止了eclipse生成R.java。

【讨论】:

是的,我有。我的问题有很多问题,希望你不要指望我删除所有类中对 R.java 的每一个引用...... 2LambergaR:我的意思是你应该先检查你的 xml/aidl/AndroidManifest.xml。可能是有些问题,那s why eclipse cant 生成R.java。 我已经检查过了……没问题【参考方案6】:

我遇到了同样的问题,我使用大写字母命名了一个资源文件(一个 .png 图像)。 (ImageButton001.png 而不是 imagebutton001.png)。

更改文件名后,我的 R.java 又回来了。

Rgards, 娟

【讨论】:

【参考方案7】:

如果可用内存不足,构建工具将静默失败(Eclipse 不会在错误日志中显示任何错误或报告任何内容)。关闭其他打开的应用程序(例如模拟器和浏览器),然后在应用程序清单文件中添加一个空格并保存。

【讨论】:

【参考方案8】:

正如 ponkin 所说 - 您可能有一个问题导致 R 无法重新生成自身,因此您现在遇到了一百万零一个问题。

不要尝试自己创建 R 类。试着想想你一直在弄乱的最后一个 XML,并检查它是否有错误

我也遇到了同样的问题here

【讨论】:

【参考方案9】:

确保您的清单文件没有错误。 如果删除/res/values/strings.xml中的资源字符串app_name,它不知道如何正确生成R.java。 我在做 HelloSpinner 教程时发现了这个问题。

【讨论】:

【参考方案10】:

我发现不想要的资源导致了问题。我一删除资源就生成了 R.java。

【讨论】:

这有多种原因。就我而言,删除资源(xml)文件就可以了。不是我不需要那个 xml 文件,我必须重新创建它。奇怪!【参考方案11】:

我遇到了这个问题,要重建 R.java 我剪切了我刚刚处理的 xml 文件中的代码(或者如果这不起作用,请尝试其他文件),删除该文件然后使用相同的名称并将代码粘贴回其中。希望这会有所帮助。

【讨论】:

【参考方案12】:

值得一提的是,如果 XML 文件包含 ?,则不会重新生成 R.java,并且错误不会显示在 XML 文件中(有时会在一段时间后显示) 我有一条类似于:

< string name="questionmark"\>?< /string> <br>

尝试改变 ?到别的东西,看看R.java 文件会发生什么 - 对我有用

【讨论】:

【参考方案13】:

我遇到了类似的问题,我在 Raw 文件夹中用大写字母重命名了一个 .wav 文件。当我改为全部小写时,清理项目并重建R.java 很好。

【讨论】:

【参考方案14】:

正如其他人所说,不要创建自己的 R.java 文件。我刚开始使用 Android 时遇到了同样的问题,花了一些时间才弄清楚编译错误是什么原因造成的。

您想对R.java 文件做什么?

【讨论】:

创建我自己的(空的!)R.java 文件是我做的最后一件事。当它对我完全失败时,我首先尝试清理项目,手动重建它,然后我删除了文件并重建了项目(什么也没发生)。所以最后我创建了一个新类,命名为 R.java - 首先是一个空类,然后我添加了基本类(数组、attr、drawable、id、布局和字符串),此时系统实现了 R.java。 java 已更改并试图重建它 - 在此过程中惨遭失败。【参考方案15】:

我遇到了同样的问题。我刚刚去了:

Project -> Properties -> Android 

并为我的项目选择了合适的模拟器,那一刻我有 3 种不同的模拟器可供选择。我意识到我在某个特定时刻改变了模拟器。所以尝试更改模拟器,这可能会有所帮助!

祝你好运

【讨论】:

你能改写这个答案吗?它实际上是一个长句子【参考方案16】:

我在 IntelliJ 上遇到了同样的问题。问题是我在strings.xml 中定义了两次 app_name 出于某种原因,IDEA 检查没有自动检测到它。

【讨论】:

【参考方案17】:

我在另一个网站上读到了这篇文章,它对我有帮助:

“如果这不能解决您的问题,请尝试修改您的 AndroidManifest.xml(只需添加一个空格并保存)。我听说这会强制 R.java 重建。”

所以只需在清单文件中添加一个空格,然后重新构建!

【讨论】:

【参考方案18】:

附带说明一下,通常这些 *.out.xml 文件是通过尝试构建您的项目而生成的,而 xml 文件集中在编辑器中

【讨论】:

【参考方案19】:

我有类似的问题。清理项目没有解决问题,代码或文件名中的大写或空格没有错误。

当您选择 PROJECT-->CLEAN 然后取消选中“立即开始构建”选项时,解决方案将出现一个弹出窗口。清理项目。关闭并重新打开 Eclipse,然后构建项目(PROJECT-->BUILD)。

问题仍然是为什么简单的清理和构建而不关闭 Eclipse 不起作用。

【讨论】:

以上是关于R.java 文件背后的魔法的主要内容,如果未能解决你的问题,请参考以下文章

meta.Vectors 背后的黑魔法是啥?

styled-components 背后的魔法

现代化Spring开发与背后的魔法

现代化Spring开发与背后的魔法

Objective C block背后的黑魔法

3.5 魔法方法