Java资源背后的概念,引人注目的gs,“R.id”

时间:2013-04-14 04:23:14

标签: java android xml

我遇到了一个让我意识到我没有得到核心概念的问题。 出于某种原因,当我去为strings.xml文件添加值时,发生了一些事情,我的xml文件给出了解析错误。我能解决这个问题的唯一方法是删除字符串文件并通过右键单击values文件夹重新创建它,然后转到“添加android xml文件”并命名为strings.xml。 这使得错误消失了,但现在,我的活动正在抱怨并说他们无法解决R(如R.id中所述)。

这让我很好奇R和xml文件之间的关系。为什么当你引用一个字符串时,你使用@String/something,当包含它的文件被称为strings时?

最后为什么即使我在正确的位置创建了一个名为strings.xml的xml文件,我的项目也看不到他是THE strings.xml文件?

3 个答案:

答案 0 :(得分:2)

<强>姓名

R资源以特定方式组织:

  • R.layout.* - 这些资源是您在各种layout-*文件夹中创建的布局文件
  • R.menu.* - 这些资源是您在各种menu-*文件夹中创建的菜单文件。
  • R.id.* - 这些是各种视图和菜单项等的资源标识符。只要它们位于不同的文件中,就可以有多个具有相同ID的元素。
  • R.string.* - 这些是您的字符串资源,在<string>文件夹中的values-*个元素中声明。文件名无关紧要。在一个文件夹中只能有一个具有特定名称的字符串元素。因此,hello中不能包含两个values字符串,但valuesvalues-en中各有一个字符串。
  • R.drawable.* - 这些是drawable-*文件夹中的各种XML和图像可绘制内容。

还有更多,但这些是最常见的。当我有更多时间在我手上时,我会补充其余部分。

编译后

在编译期间,Android构建系统将所有XML文件放入二进制格式。除了/res/raw之外的所有内容都会被压缩。这对布局特别有用,布局可以在压缩后更快地膨胀。编译后单个文件不再存在,一切都变成一个大的二进制文件。您可以使用Java中的R.<resource_type>.<name>和XML中的@<resource_type>/<name>访问此文件中的数据

<强>命名

对于某些资源(drawables,layouts,menus),文件名很重要,因为资源是使用它来引用的。对于其他资源(字符串,颜色,样式),只要在文件中声明它们时使用正确的元素(例如,对于字符串<string>),文件名就无关紧要了。

答案 1 :(得分:1)

当您的项目被编译和构建时,发生的一件事就是生成R文件。每个命名资源都有一个public static final int标识符,如R.string.foo,它将引用由name="foo"定义的字符串。这样您就可以从Java引用资源,Android会将其映射到资源并从您的应用程序包加载它。

资源可以重载;你可以有两个名为foo的字符串,它们符合不同的配置,但它们在R类中具有相同的标识符。系统将在运行时选择与设备配置最匹配的那个。

如果您的任何资源声明出错,R将无法构建,因此任何引用它的java类都会抱怨它。你可以做项目&gt;在Eclipse中清理并查看是否有帮助,但另外确保您的资源已正确声明和/或具有有效名称。

答案 2 :(得分:-2)

R.java is a seperate file created by eclipse, 
its not related to strings.xml ,Clean your project then build and run again . 
you will found R.java inside your gen folder
Read this

http://developer.android.com/tools/projects/index.html