在android中,R.java用于提供对XML文件中定义的资源的访问。
要访问资源,我们需要调用传递要获取的资源的id的findViewById()
方法。
这类似于Spring,其中bean在XML上下文中定义,并通过使用应用程序上下文获取。 context.getBean("beanId")
这提供了松耦合,因为bean是在外部定义的,可以在不修改代码的情况下进行更改。
这让我很困惑。虽然Android看起来与spring相似,但它有什么优势呢?
请原谅我的无知。我是一个新手Java开发人员,一次尝试太多东西。 :-) 感谢所有的反馈。
- 反正拥有中间R.java有什么意义?我们难道不能通过使用资源直接从XML获取资源 读者/应用背景。例如
findViewById("resourceId")
- 没有任何松耦合。由于R.java中的引用会自动生成,因此如何删除资源并放入新资源?
- 它遵循什么设计模式(如果有)?
- 使用IOC(如Roboguice)注入资源不是更好吗?为什么谷歌决定给我们这样的 一种处理资源的奇怪方式?
醇>
答案 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,以及你可以在资源中声明的任何内容。