R.java 背后的概念是啥?
Posted
技术标签:
【中文标题】R.java 背后的概念是啥?【英文标题】:What is the concept behind R.java?R.java 背后的概念是什么? 【发布时间】:2012-04-17 19:03:48 【问题描述】:在android 中,R.java 用于提供对XML 文件中定义的资源的访问。
要访问资源,我们需要调用 findViewById()
方法,传入要获取的资源的 id。
这类似于 Spring,其中 bean 在 XML 上下文中定义并使用应用程序上下文获取。 context.getBean("beanId")
这提供了松散耦合,因为 bean 是在外部定义的,并且可以在不修改代码的情况下进行更改。
这让我很困惑。虽然 Android 做的东西看起来和 spring 很像,但它有什么优势呢?
无论如何,拥有中间 R.java 有什么意义?难道我们不能直接通过使用资源从 XML 中获取资源吗? 阅读器/应用程序上下文。例如
findViewById("resourceId")
没有任何松散耦合。由于 R.java 中的引用是自动生成的,如何删除资源并放入新资源? 它遵循什么设计模式(如果有的话)? 使用 IOC(如 Roboguice)注入资源不是更好吗?为什么然后谷歌决定给我们这样 一种奇怪的资源处理方式?
原谅我的无知。我是一名新手 Java 开发人员,一次尝试了太多事情。 :-) 感谢所有反馈。
【问题讨论】:
我只想把你的问题加两遍,这是一个非常有趣的问题 【参考方案1】:它还包含对资源的访问——例如 id、drawable、布局、字符串、数组,以及基本上任何你可以在资源中声明的东西。
【讨论】:
感谢您为 *** 做出贡献。考虑阅读有关如何回答问题的 Help Center 条目。如所写,您的答案本身并不是一个完整的答案。它指的是其他问题的上下文。考虑列出 R.java 中的内容,而不仅仅是其他海报遗漏的内容。【参考方案2】:最大的优势在于本地化和为不同的屏幕尺寸提供替代资源。
例如,您可以拥有一个字符串资源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 文件
【讨论】:
【参考方案3】:比较感觉有点 有点(实际上)很奇怪,因为你比较两种机制是基于它们使用命名的东西做事。例如,对于资源加载,请查看 .Net
世界中的资源处理方式。
它提供编译时检查资源是否可用。因为如果不是,R.java
内部就不会有指向它的静态变量。在 Spring 示例中,您如何确定有一个名为 beanId
的 bean?但是,它不提供检查它是否是正确的资源类型。
为什么这不是松散的?只要新资源具有相同的名称,它就会生成相同的静态常量。在 Spring 中,您必须使用相同的 bean 名称。
设计模式?没有。它只是通过命名资源来增加一层间接性,然后仅按名称引用它们,而不是直接从它们的真实位置加载它们。
实际上,资源是注入的,因为资源加载必须应对本地化。请参阅here 了解 Android 的处理方式;在.Net
世界中,额外的文化被打包到卫星组件中; resource manager 将根据当前文化加载正确的。
【讨论】:
【参考方案4】:android.R.java 不仅仅是存储 XML id 的地方。它还包含对资源的访问 - 例如可绘制对象、布局、字符串、数组,以及基本上可以在资源中声明的任何内容。
我个人发现在使用 Eclipse 时它很有用。我可以简单地输入findViewById(R.id.
,Eclipse 将显示一个工具提示,其中包含可供选择的选项列表。
但是在平台级别,我想说硬编码的 id 变量有助于防止在使用字符串来识别资源时出现错误——在编程时(或在编译期间,而不是运行时)可以调试的东西。
【讨论】:
不能再同意了。我认为编译时检查是值得的。编译时安全是我喜欢 Java 胜过其他动态语言的原因之一。 :-)以上是关于R.java 背后的概念是啥?的主要内容,如果未能解决你的问题,请参考以下文章