R.java背后的概念是什么?

时间:2012-04-04 04:24:05

标签: android architecture android-resources r.java-file

在android中,R.java用于提供对XML文件中定义的资源的访问。 要访问资源,我们需要调用传递要获取的资源的id的findViewById()方法。

这类似于Spring,其中bean在XML上下文中定义,并通过使用应用程序上下文获取。 context.getBean("beanId")

这提供了松耦合,因为bean是在外部定义的,可以在不修改代码的情况下进行更改。

这让我很困惑。虽然Android看起来与spring相似,但它有什么优势呢?

  
      
  1. 反正拥有中间R.java有什么意义?我们难道不能通过使用资源直接从XML获取资源   读者/应用背景。例如findViewById("resourceId")
  2.   
  3. 没有任何松耦合。由于R.java中的引用会自动生成,因此如何删除资源并放入新资源?
  4.   
  5. 它遵循什么设计模式(如果有)?
  6.   
  7. 使用IOC(如Roboguice)注入资源不是更好吗?为什么谷歌决定给我们这样的   一种处理资源的奇怪方式?
  8.   
请原谅我的无知。我是一个新手Java开发人员,一次尝试太多东西。 :-) 感谢所有的反馈。

4 个答案:

答案 0 :(得分:21)

最大的优势在于本地化并为不同的屏幕尺寸提供备用资源。

例如,您可以拥有一个字符串资源R.string.myname,这可以在/values-en/strings.xml中以英语定义,在/values-es/strings.xml中以西班牙语定义

系统会照顾或选择正确的文件,具体取决于您在布局文件中使用@string/myname或在代码中使用R.string.myname所需的区域设置。

同样,您可以在

中定义两个用于纵向和横向的布局文件
res/layout/mylayout.xml
res/layout-land/mylayout.xml

在您的代码中,您只需指定R.layout.mylayout来扩充布局。资源经理 如果设备处于横向模式,则在layout-land中拾取文件。

手动执行此操作将是一场噩梦 - 因此需要R文件

答案 1 :(得分:19)

android.R.java 不仅仅是存储 XML ID的地方。它还包含对资源的访问 - 例如drawable,布局,字符串,数组,以及您可以在资源中声明的任何内容。

我个人认为使用Eclipse时它很有用。我只需键入findViewById(R.id.,Eclipse就会显示一个工具提示,其中包含可供选择的选项列表。

然而,在平台级别,我会说硬编码的id变量有助于防止在使用字符串识别资源时出现错误 - 在编程时(或在编译期间,而不是在运行时)可以调试。

答案 2 :(得分:1)

比较感觉有点 有点(实际上)很奇怪,因为你比较两种机制基于他们使用命名的东西的事实做的事。对于资源加载,例如,查看如何在.Net世界中完成资源处理。


它提供编译时检查资源是否可用。因为如果不是,那么R.java内部就不会有静态指向它。在Spring示例中,您如何确定有一个名为beanId的bean?但是,它不会检查它是否是正确的类型资源。

为什么这不松动?只要新资源具有相同的名称,它就会生成相同的静态常量。在Spring中,您必须使用相同的bean名称。

设计模式?没有。它只是通过命名资源添加一个间接级别,然后仅通过名称引用它们,而不是直接从它们的真实位置加载它们。

实际上,资源注入的,因为资源加载必须应对本地化。有关Android的功能,请参阅here;在.Net世界,其他文化被包装成卫星组件; resource manager将根据当前文化加载正确的文本。

答案 3 :(得分:0)

它还包含对资源的访问权限 - 例如id,drawables,layouts,strings,arrays,以及你可以在资源中声明的任何内容。