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 背后的概念是啥?的主要内容,如果未能解决你的问题,请参考以下文章

XSS 背后的一般概念是啥?

Facebook 实时聊天背后的概念(数据传输)是啥?

Access-Control-Allow-Origin 和 CORS 背后的概念是啥?

R.java 文件背后的魔法

ScreenPointToRay,该功能的背后是啥?

主动降噪背后的理论是啥?