Android XML 布局文件和命名空间

标签 android xml

Android 布局是在 XML 中定义的,在根元素中声明了这个命名空间:

xmlns:android="http://schemas.android.com/apk/res/android"

元素示例:

<TextView android:layout_width="fill_parent" android:layout_height="wrap_content" />
  1. 为什么使用 android 前缀而不是像 xmlns="http... 那样省略它?
  2. 为什么前缀只用在属性中而不用在元素中?

最佳答案

有趣的问题!确实感觉有点怪。

  1. Google 的设计选择是在命名空间上尽可能严格以在编译时处理错误。
  2. 在元素上不使用前缀,因为这些代表 Java 类:com.android.widget.TextView(com.android.widget.* 总是可以被截断)。此类的 java 命名空间将在编译时自动解析,因此这里不欢迎代表完全限定的 java 命名空间的 xml 命名空间。但是属性可以映射到 Element 的任何继承的 java 类。因此,属性上的命名空间允许继承。

这样做主要是因为布局描述了 Java 对象,而 Google 在这里使用 XML 命名空间机制来帮助将布局与 Java 对象映射。因此,Java 命名空间世界和 XML 命名空间世界之间存在冲突。 它还允许我们开发人员对元素进行子类化,添加我们自己的属性,而不必担心下一个版本的平台可能会添加同名的属性。

请参阅 Dianne Hackborn 对这篇博文的两条回复,他是一位在 google 工作的知名 android 工程师:http://www.elharo.com/blog/software-development/xml/2008/09/16/android-xml-weirdness/

关于Android XML 布局文件和命名空间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5404560/

相关文章:

Java DOM 解析器在某些字符串上返回空指针,但在其他字符串上不返回

android - 当绑定(bind)的数据仍在加载时(需要几毫秒才能完全加载),如何在 onBindViewHolder 中延迟 bind()?

android - Android 中的 ApplicationInfo 适配器仅显示具有启动器 Intent 的应用程序

android - 在 HTC Sense 设备上更改屏幕亮度

java - 为什么背景颜色拒绝填满整个屏幕

javascript - 如何删除带有双引号的访问JS对象属性

android - kitkat 版本中开关小部件的空指针异常

android - 获取要发布的 key 哈希

xml - 如何在Perl中比较不同元素的XML属性值

xml - 来自 C++ 的 MSXML - pretty-print /缩进新创建的文档