【发布时间】:2013-03-02 05:17:40
【问题描述】:
为什么,资源被转换成 HEXAdecimal ,它是否会为您的应用程序创建一些对资源的快速访问。
【问题讨论】:
-
它们没有被转换成任何东西。您只是碰巧将它们视为十六进制。它可能同样是八进制或实际上是二进制,这就是它们的真正含义。
标签: android r.java-file
为什么,资源被转换成 HEXAdecimal ,它是否会为您的应用程序创建一些对资源的快速访问。
【问题讨论】:
标签: android r.java-file
R.java 只不过是一个类文件,对于项目中的每个资源都有一个静态常量。常量是一个有效的文件系统的索引号。所以 myicon.png 被赋予了 12345 的文件号。资源管理器使用这个索引在运行时加载资源。打开它。看看吧。
我们来看一个R.java的例子:
public final class R {
public static final class id {
public static final int myTextView=0x7f090008;
}
}
我可以使用以下方法引用 myTextview:
findViewById(R.id.myTextView) - constant
findViewById(0x7f090008) - hex
findViewById(2131296264) - decimal
findViewById(017702200010) - octal
findViewById(0b1111111000010010000000000001000) - binary
它们都是等价的。
同样,我可以像这样编写我的 R.java 文件:
public final class R {
public static final class id {
public static final int myTextView=0b1111111000010010000000000001000;
}
}
它仍然有效。
没有什么是“转换的”,你只是使用一个常量来引用索引号。编译器会处理它。您只是碰巧将其视为十六进制,但最终,就像您应用中的所有内容一样,它只是 1 和 0。
这样做的唯一原因是您可以使用这些常量。想象一下,如果您必须使用实际的索引值来维护您的代码,尤其是考虑到它们可能会在您每次重建 R.java 时发生变化。
索引号不是内存地址、偏移量或特殊类型的奶酪。它们只是由编译器生成的常量,使您能够使用友好的名称访问资源。
【讨论】:
R.java 文件由 Android 资源管理器Android 资产管理器打包器(aapt.exe) 生成,其中包含对您应用的所有资源的引用。每个引用都是一个唯一的 id(public static final int)。这些常量以十六进制格式写入 R.java 文件。
【讨论】:
从 android 的角度来看,这是一种架构。当您开发 Android 应用程序并只是构建代码(未安装在设备/模拟器上)时,资源管理器会为所有资源分配唯一地址。一旦应用程序安装在设备上,实际的内存分配就会发生,这个文件将帮助 Android 映射它所需的实际内存。
希望这能回答你的问题
【讨论】: