文档章节

属性资源与Android命名空间

lightUp
 lightUp
发布于 2015/10/20 15:18
字数 1136
阅读 947
收藏 0
点赞 0
评论 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

共有 人打赏支持
lightUp
粉丝 10
博文 242
码字总数 287936
作品 0
杭州
程序员
Android清单文件详解(一) ---- 一切从开始

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

mickelfeng
06/04
0
0
xmlns:android的说明

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

AlexMahoneFBI
2014/08/26
0
0
AndroidManifest.xml详解

我们在进行APP开发的时候都会遇到一个文件:AndroidManifest.xml。从刚开始进行Android开发,到现在已经过去了几个月,还是对这个文件一知半解,只知道它是配置用的。但是这文件里的东西具体...

闪电的蓝熊猫
05/14
0
0
【转】Android xml资源文件中@、@android:type、@*、?、@+含义和区别

一.@代表引用资源 1.引用自定义资源。格式:@[package:]type/name android:text="@string/hello" 2.引用系统资源。格式:@android:type/name android:textColor="@android:color/opaque_red......

mj4738
2011/12/27
0
1
[安卓教学] 创建你的第一个安卓应用 - 第三课 - 建立一个简单的用户界面

一个安卓应用(Android app)的图形用户界面(graphical user interface)是由一系列有层级关系的View(视图组件)和ViewGroup(视图组件组)对象构成。View对象一般是像按钮(buttons)或者...

夜游长空
2014/03/20
0
0
Android开发指南-框架主题-清单文件

清单文件The AndroidManifest.xml File 每个应用程序都有一个AndroidManifest.xml文件(一定是这个名字)在它的根目录里。这个清单文件给Android系统提供了关于这个应用程序的基本信息,系统...

JavaGG
2010/03/24
0
0
Android xml manifest属性详解

manifest extras: 例子: <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.woody.test" android:sharedUserId="string" android:sharedUserLabel="str......

恰同学少年
2015/07/28
0
0
android之XmlSerializer序列化XML(写入)

首先,我们看一下什么是serializer,serializer就是串行化,又名序列化。它可并不只是简单的把对象保存在存储器上,它可以使我们在流中传输对象,使对象变的可以像基本数据一样传递。 最终效...

今日竹石
2014/03/24
0
0
【初印象】有关Android中的目录结构的意义

目录结构 1)src目录为源文件 2)gen目录里的R.java文件为Eclipse自动生成文件,不必手动修改 3)Android Library,应用运行的Android库 4)assets目录,在这个目录里主要放置多媒体等一些文...

RankoWong
2013/03/17
0
0
Android应用程序资源的编译和打包过程分析

我们知道,在一个APK文件中,除了有代码文件之外,还有很多资源文件。这些资源文件是通过Android资源打包工具aapt(Android Asset Package Tool)打包到APK文件里面的。在打包之前,大部分文...

Luoshengyang
06/26
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

idea tomcat 远程调试

tomcat 配置 编辑文件${tomcat_home}/bin/catalina.sh,在文件开头添加如下代码。    CATALINA_OPTS="-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=7829" Idea端配......

qwfys
今天
1
0
遍历目录下的文件每250M打包一个文件

#!/usr/bin/env python # -*- utf-8 -*- # @Time : 2018/7/20 0020 下午 10:16 # @Author : 陈元 # @Email : abcmeabc@163.com # @file : tarFile.py import os import tarfile import thr......

寻爱的小草
今天
1
0
expect同步文件&expect指定host和要同步的文件&构建文件分发系统&批量远程执行命令

20.31 expect脚本同步文件 expect通过与rsync结合,可以在一台机器上把文件自动同步到多台机器上 编写脚本 [root@linux-5 ~]# cd /usr/local/sbin[root@linux-5 sbin]# vim 4.expect#!/...

影夜Linux
今天
1
0
SpringBoot | 第九章:Mybatis-plus的集成和使用

前言 本章节开始介绍数据访问方面的相关知识点。对于后端开发者而言,和数据库打交道是每天都在进行的,所以一个好用的ORM框架是很有必要的。目前,绝大部分公司都选择MyBatis框架作为底层数...

oKong
今天
13
0
win10 上安装解压版mysql

1.效果 2. 下载MySQL 压缩版 下载地址: https://downloads.mysql.com/archives/community/ 3. 配置 3.1 将下载的文件解压到合适的位置 我最终将myql文件 放在:D:\develop\mysql 最终放的位...

Lucky_Me
今天
2
0
linux服务器修改mtu值优化cpu

一、jumbo frames 相关 1、什么是jumbo frames Jumbo frames 是指比标准Ethernet Frames长的frame,即比1518/1522 bit大的frames,Jumbo frame的大小是每个设备厂商规定的,不属于IEEE标准;...

问题终结者
今天
2
0
expect脚本同步文件expect脚本指定host和要同步的文件 构建文件分发系统批量远程执行命令

expect脚本同步文件 在一台机器上把文件同步到多台机器上 自动同步文件 vim 4.expect [root@yong-01 sbin]# vim 4.expect#!/usr/bin/expectset passwd "20655739"spawn rsync -av ro...

lyy549745
今天
1
0
36.rsync下 日志 screen

10.32/10.33 rsync通过服务同步 10.34 linux系统日志 10.35 screen工具 10.32/10.33 rsync通过服务同步: rsync还可以通过服务的方式同步。那需要开启一个服务,他的架构是cs架构,客户端服务...

王鑫linux
今天
1
0
matplotlib 保存图片时的参数

简单绘图 import matplotlib.pyplot as pltplt.plot(range(10)) 保存为csv格式,放大后依然很清晰 plt.savefig('t1.svg') 普通保存放大后会有点模糊文件大小20多k plt.savefig('t5.p...

阿豪boy
今天
3
0
java 8 复合Lambda 表达式

comparator 比较器复合 //排序Comparator.comparing(Apple::getWeight);List<Apple> list = Stream.of(new Apple(1, "a"), new Apple(2, "b"), new Apple(3, "c")) .collect(......

Canaan_
昨天
1
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部