文档章节

属性资源与Android命名空间

lightUp
 lightUp
发布于 2015/10/20 15:18
字数 1136
阅读 960
收藏 0

更新: 对于自定义属性资源,现在不实用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>

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

本文转载自:http://book.51cto.com/art/201311/418541.htm

共有 人打赏支持
上一篇: andorid actionBar
下一篇: volley
lightUp
粉丝 10
博文 242
码字总数 287936
作品 0
杭州
程序员
私信 提问
Android清单文件详解(一) ---- 一切从开始

在AndroidManifest.xml文件中,首先看到是的<manifest>节点,它是整个应用程序的基本属性,涵盖了默认进程名字,应用程序标识,安装位置,对系统的要求以及应用程序的版本等。它是AndroidMa...

mickelfeng
2018/06/04
0
0
Android应用资源---绘制资源类型(Drawable)(四)

级别列表 级别列表管理着一组可选择的绘制资源,被管理的每个资源都会给分配一个最大的数字值。调用setLevel()方法给装载在级别列表中的有android:maxLevel属性的绘制资源设置级别值。andro...

长平狐
2012/10/16
81
0
AndroidManifest.xml文件详解(permission-tree)

语法(SYNTAX): 被包含于(CONTAINED IN): 说明(DESCRIPTION): 这个元素用于声明权限树的根节点名称,应用程序持有树中定义的所有权限名称所对应的权限。通过调用PackageManager.addP...

长平狐
2012/10/16
182
0
xmlns:android的说明

xmlns:android xmlns:android:命名空间的声明 “xmlns:android这是一个XML命名空间,告诉Android开发工具你准备使用Android命名空间里的一些通用属性。 在所有Android XML设计文件中最外层的...

AlexMahoneFBI
2014/08/26
0
0
android -------- Data Binding的使用 ( 六) 自定义属性

今天来说说DataBinding在自定义属性的使用 默认的android命名空间下,我们会发现并不是所有的属性都能直接通过data binding进行设置,比如margin,padding,还有自定义View的各种属性。 默认...

切切歆语
2018/09/22
0
0

没有更多内容

加载失败,请刷新页面

加载更多

如何从复杂单体应用快速迁移到微服务?

想必你已知道了微服务及其工作原理,现在是时候探讨如向微服务转变这个关键话题了。 为什么要向微服务转变 整体式(monolithic)应用程序很庞大(代码行数方面)、很复杂(功能依赖和数据等方...

架构师springboot
23分钟前
1
0
Maven与打包方式总结

一. war包 一般都是直接打成war包即可, 相关依赖都会放到 WEB-INF/lib 下. <plugin> <artifactId>maven-war-plugin</artifactId> <configuration> <version>3.0</version>......

foreach
25分钟前
1
0
JDBC详解

一、相关概念 1.什么是JDBC   JDBC(Java Data Base Connectivity,java数据库连接)是一种用于执行SQL语句的Java API,可以为多种关系数据库提供统一访问,它由一组用Java语言编写的类和接...

木云凌
47分钟前
2
0
分布式之延时任务方案解析

方案分析 (1)数据库轮询 思路 该方案通常是在小型项目中使用,即通过一个线程定时的去扫描数据库,通过订单时间来判断是否有超时的订单,然后进行update或delete等操作 实现 博主当年早期是用...

微笑向暖wx
51分钟前
1
0
博客目录

1.剑指offer目录 剑指offer目录 2.开放的面试题 开放面试题目录

细节探索者
51分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部