属性资源与Android命名空间

更新: 对于自定义属性资源,现在不实用http://schemas.android.com/apk/res/<Packge name> 的形式了, 统一用

"http://schemas.android.com/apk/res-auto"

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

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

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

在这段代码中设置了android:layout_width和android:layout_height属性,我们会发现,如果将android:layout_width改成android:layout_width1,一定是无法编译通过的。而如果不加android命名空间,可以任意设置<TextView>标签的属性,只要属性和属性值符合XML规范,就可以编译通过。例如,下面的<TextView>标签设置了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/<Package Name>

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

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

<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>

当然,属性资源还不仅仅能限制属性名,还可以约束属性值,

时间: 2024-10-07 00:14:49

属性资源与Android命名空间的相关文章

结合Android命名空间,自定义一个横向柱状图

话不多说先上图: 类似于这样的效果,很简单.这是一个listview,item是自定义的view,有两个特点: 传入长度,动态改变柱状图的长度: 根据长度改变色值,长度越长越红,反之越黄. 用到的知识点无非是paint在canvas上画图,这里不赘述,想了解但是不了解的童鞋可以看我上一篇日志. 传送门:http://blog.csdn.net/zhaoyingkun/article/details/44340365 在这里最想提到的一点是关于Android命名空间的使用. 是怎么想到的呢,我发现

【资源】Android学习资料 - 逆天整理 - 精华无密版

 入门看视频,提高看书籍,飘升做项目.老练研开源,高手读外文,大牛讲低调~  极客学院安卓Android全套最新视频教程[17G全套视频+独家源码] http://pan.baidu.com/s/1kT5nSkn 链接: http://pan.baidu.com/s/1jGsyJ0y 密码: btbg 传智播客Java安卓方向就业班全套视频下载 http://pan.baidu.com/s/1eQq4YXG 链接: http://pan.baidu.com/s/1qWA3yyS 密码: p7qj

14.C#属性访问器、命名空间、pragma指令(七章7.3-7.5)

看到一些零星的知识片,今天就用自己的理解说明下,也是因为太简单了,一下就过的,也是我们日常开发中常用.留下一个脚印,当书不在手上的,也能翻出来看看.说下属性访问器.命名空间和pragma指令. 属性访问器在01.C#数据类型.排序.过滤(一章1.1-1.2)有所提到,在C#3后可以使用修饰符去修饰属性的取值和赋值,也可以使用加入一些验证,如下: 1 class Plant 2 { 3 private double Height = 0.0; 4 5 //是否需要修剪 6 public bool

很好的资源 for android

// 很好的资源 for android https://github.com/openproject/world2 http://www.cnblogs.com/qianxudetianxia/archive/2011/05/02/2034303.html http://www.cnblogs.com/qianxudetianxia 拖拽 listview https://github.com/fjtianxia/qianxudetianxia

android中在xml文件中使用View在某个控件的上方画一条线;android:listSelector的属性说明;android:visibility=&quot;gone&quot;

一.例如RelativeLayout中android:visibility="gone" 其有三个属性:visible显示:invisible显示黑背景条:gone不显示 在类中,可以设置其显示与否,setVisibility(View.GONE);不显示 setVisibility(View.VISIBLE);显示 二. android:listSelector的属性说明 <GridView android:id="@+id/gridview_numberkeyboa

Intent的Component,Action和Category属性详解-android学习之旅(五十)

Component属性 代码示例 public class MainActivity extends Activity{ @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); findViewById(R.id.btnIntent).setOnClickListener(ne

Android样式(style)和主题(theme)资源介绍-android学习之旅(五十六)

样式(style)资源 代码示例 <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="mat

ScrollView属性fillViewport解决android布局不能撑满全屏的问题

转:http://blog.sina.com.cn/s/blog_6cf2ea6a0102v61f.html 开发项目中遇到一个问题,布局高度在某些国产酷派小屏幕手机上高度不够全部显示,于是使用了ScrollView嵌套LinearLayout,但问题又出现了,在大屏幕手机如三星note3手机上下面会留白,问题的解决办法是在第一层LinearLayout里面嵌套多个LinearLayout,最重要的是将ScrollView中android:fillViewport设置为true. 当Scroll

Android反编译获取资源文件-android学习之旅(69)

有时候你看到一些很好看的布局,会考虑别人怎么实现的,回想参考一下,那么这时候反编译一下是很必要的. 要用到的工具apktool.bat和aapt.exe和apktool.jar(要最新版本) 下载前两个网址是http://apktool.shoujifans.com/ apktool.jar要求是最新版,所以到官网去下载http://ibotpeaches.github.io/Apktool/ 要是嫌麻烦,就去我的网址下载,打包好了. 下载链接http://download.csdn.net/d