转载自转载原文

感觉原文写的挺好,就直接转载过来了,原文作者若有疑问,请知会我~~

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

声明xml命名空间。xmlns意思为“xml namespace”.冒号后面是给这个引用起的别名。
schemas是xml文档的两种约束文件其中的一种,规定了xml中有哪些元素(标签)、元素有哪些属性及各元素的关系,当然从面向对象的角度理解schemas文件可以认为它是被约束的xml文档的“类”或称为“模板”。

早期或简单的xml用的是另一种约束,称为DTD,这东西大家天天都见到。html/xhtml中都存在(早期的html可能没有),如”http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd“。

现在大部分xml文档的约束都换成schema了,原因是schema本身也是xml,二schema扩展性强

到现在为止我们已经接触过非常多的布局资源、AndroidManifest.xml文件以及其他XML格式的文件。可能很多读者会有一些疑问,例如,很多XML格式的文件中为什么非要定义一个android命名空间,这个命名空间有什么特殊含义呢?为什么每一个视图标签指定属性时必须要加上android命名空间呢?而且如果指定了错误的属性还会报错,以至于无法编译程序。

为了不让读者带着这些疑问继续学习后面的章节,将借布局这块宝地为读者解答这些疑问。本节的内容并不只是针对布局的,而是大多数XML格式的文件都需要做这样的设置,因此本节的内容相对独立。如果读者对这方面的内容已经了解,可以略过本节继续学习下面的内容。当然,也可以跳过前面的章节直接阅读本节的内容。

如果读者阅读了4.1.2小节的内容,相信对R类已经有了一个基本的了解。Android应用程序将所有的静态资源都封装在了APK文件中,并根据这些资源文件名(不包括扩展名)或key属性的值生成资源ID。这些ID将作为变量的形式被定义在R类的相应子类中。例如,所有的图像资源(res/drawable目录中的资源文件)都会在R.drawable类中生成相应的变量,变量名就是图像资源的文件名。当使用这些资源时,只要引用R类中相应的变量,系统就会知道上哪去寻找相应的资源。大多数资源的定位很好理解,例如,”@string/hello”引用了字符串资源hello。”@drawable/icon”引用了图像资源文件(可能是icon.png、icon.jpg等图像)。但有一类资源的引用可能大多数初学者不太注意,这就是属性资源。

为了解释属性资源,现在先来看一段标签的定义代码。

<TextView         android:layout_width="wrap_content"         android:layout_height="wrap_content"/> 

在这段代码中设置了android:layout_width和android:layout_height属性,我们会发现,如果将android:layout_width改成android:layout_width1,一定是无法编译通过的。而如果不加android命名空间,可以任意设置标签的属性,只要属性和属性值符合XML规范,就可以编译通过。例如,下面的标签设置了test属性后,完全可以进行正常编译。

<TextView         android:layout_width="wrap_content"         android:layout_height="wrap_content"         test="value"/> 

从这一点可以判断,系统对android:layout_width属性的验证与XML本身无关。那么到底与什么有关呢?

实际上,android:layout_width要分开来看,首先看layout_width。系统内部有一个系统级的R.java文件,所有的系统资源生成的ID都在该文件中的R类相关子类中定义。而在这个R类中有一个attr子类,用于定义系统中所有的属性,也就是XML标签设置的属性名,而这个R类的Package就是android。

我们并不需要去关心R类的代码,因为这个R类是在Android源代码编译时自动生成并编译的,Android源代码和Android SDK中并没有这个R类的源代码。不过读者可以随便找一个Android工程,选择Android 4.2开发包(也可以是其他版本),很容易就可以找到R类及其attr子类,如图8-12黑框中所示。

在attr类中有很多我们已经很熟悉的成员变量,例如,layout_width、layout_height就是attr类中的两个变量。那么这个属性资源有什么用呢?

系统在检测XML标签属性时,如果可以确定某一个R类的位置,就会认为当前XML标签的属性名必须与R.attr类中某个变量名一致,否则会认为该属性有误。那么系统又是如何确定R类的位置呢?

答案当然是android命名空间了,也就是说android命名空间会直接指定这个内嵌在系统中R类的位置。下面看一下android命名空间的定义。

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" ……> ……  RelativeLayout> 

我们可以看到,android命名空间的值是一个Url形式的字符串,不过这个Url是有一定规则的。这个Url的通用形式如下:

http://schemas.android.com/apk/res/
也就是说这个Url有一个叫”http://schemas.android.com/apk/res/“的前缀,后面跟的内容就是R类的Package名。结合前面android命名空间的定义可知,Package名就是android。而前面已经提到过,系统内嵌的R类的Package就是android。所以通过这个android命名空间,系统就可以知道R类的全名(Package Name + Class Name),所以就可以直接定位了 。

尽管android命名空间的值不能修改,不过android命名空间的名称是可以修改的,例如,下面的标签的设置是合法的。

<RelativeLayout xmlns:mobile="http://schemas.android.com/apk/res/android"     ……> <TextView     mobile:layout_width="wrap_content"     mobile:layout_height="wrap_content"/> RelativeLayout> 

假设在当前应用程序中R类的Package是www.mobile.com,并且要引用R类中属性资源,那么命名空间应该按如下方式设置。

<RelativeLayout xmlns:mobile="http://schemas.android.com/apk/res/www.mobile.com" ……> ……  RelativeLayout> 

当然,属性资源还不仅仅能限制属性名,还可以约束属性值,这些内容会在专门介绍资源的章节详细讨论。

更多相关文章

  1. 格式化字符串android 格式化时间
  2. Android(安卓)TextView文字横向自动滚动(跑马灯)
  3. Android(安卓)databinding(详解三)--自定义属性使用
  4. Android(安卓)Activity 横竖屏模式切换时会被destroy的问题
  5. Android(安卓)ListView几个比较特别的属性
  6. Android(安卓)_优雅实现元素间的分割线 (支持3.0以下)
  7. android 使用第三方(ShareSDK)分享
  8. ANDROID Porting系列五、定制化
  9. android layout Java代码生成器

随机推荐

  1. 防止ListView变色
  2. android不公开的面试题偶!!!
  3. Android(安卓)Copybit简介
  4. Android(安卓)Training - 网络操作(1) -
  5. Android(安卓)MediaPlayer Error -1004
  6. Android(安卓)display架构分析四-msm_fb.
  7. Android(安卓)UI布局 layer-list 简例
  8. (一) 基于Windows的Eclipse安装Android(
  9. [android] Activity 的生命周期 以及 横
  10. MAC OSX上SDK Manager无法下载Android(安