38

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

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

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

这让我很困惑。虽然 Android 的功能看起来和 spring 很像,但它有什么优势呢?

  1. 无论如何,拥有一个中间 R.java 有什么意义?难道我们不能直接通过使用资源读取器/应用程序上下文从 XML 获取资源吗?例如findViewById("resourceId")
  2. 没有任何松散耦合。由于 R.java 中的引用是自动生成的,如何删除资源并放入新资源?
  3. 它遵循什么设计模式(如果有的话)?
  4. 使用 IOC(如 Roboguice)注入资源不是更好吗?那么为什么谷歌决定给我们这样一种奇怪的资源处理方式呢?

原谅我的无知。我是一名新手 Java 开发人员,一次尝试了太多事情。:-) 感谢所有的反馈。

4

4 回答 4

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 文件

于 2012-04-04T04:50:00.377 回答
20

android.R.java不仅仅是存储XML id 的地方。它还包含对资源的访问——例如可绘制对象、布局、字符串、数组以及基本上可以在资源中声明的任何内容。

我个人发现它在使用 Eclipse 时很有用。我可以简单地键入findViewById(R.id.,Eclipse 将显示一个工具提示,其中包含可供选择的选项列表。

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

于 2012-04-04T04:38:35.287 回答
1

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


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

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

设计模式?没有任何。它只是通过命名资源添加了一层间接性,然后仅通过 name引用它们,而不是直接从它们的真实位置加载它们。

实际上,资源注入的,因为资源加载必须应对本地化。请参阅此处了解 Android 的处理方式;在.Net世界上,更多的文化被打包到卫星组件中;资源管理器将根据当前文化加载正确的。

于 2012-04-04T04:48:01.810 回答
0

它还包含对资源的访问——例如 id、drawable、布局、字符串、数组,以及基本上可以在资源中声明的任何内容。

于 2017-03-30T10:24:37.313 回答