Android 资源(resource)
在Android工程文件中专门有个res目录用于存放资源,该目录下的资源可以进行可视化的编辑,编写好的资源通过AAPT(Android AssetPackaging Tool)工具自动生成gen目录下的R.java资源索引文件,之后在Java代码和XML资源文件中就可以利用索引来调用资源了。
Android资源目录结构
Android资源除了assets目录是与res同级外,其它资源均被放在res/目录下面,该目录下面的资源文件夹并不是随意命名的,需要遵循严格的规范,否则编译生成R.java过程中会报类似“invalidresource directory name **”的错误提示,并且导致R.java自动生成失败。
常用的缺省目录和对应资源类型在SDK帮助中有表格列出,简单摘抄如下
目录Directory |
资源类型Resource Types |
res/animator |
存放定义了property animations(android 3.0新定义的动画框架)的XML文件 |
res/anim/ |
存放定义了补间动画(tweened animation)或逐帧动画(frame by frame animation)的XML文件。(该目录下也可以存放定义property animations的XML文件,但是最好还是分开存放) |
res/raw/ |
存放直接复制到设备中的任意文件。它们无需编译,添加到你的应用程序编译产生的压缩文件中。要使用这些资源,可以调用Resources.openRawResource(),参数是资源的ID,即R.raw.somefilename。 |
res/drawable/ |
存放能转换为绘制资源(Drawable Resource)的位图文件(后缀为.png, .9.png, .jpg, .gif的图像文件)或者定义了绘制资源的XML文件 |
res/color/ |
存放定义了颜色状态列表资源(Color State List Resource)的XML文件 |
res/layout/ |
存放定义了用户界面布局的XML文件 |
res/menu/ |
存放定义了应用程序菜单资源的XML文件 |
res/values/ |
存放定义了多种类型资源的XML文件 这些资源的类型可以是字符串,数据,颜色、尺寸、样式等等,具体在后面详述 |
res/xml/ |
存放任意的XML文件,在运行时可以通过调用Resources.getXML()读取 |
资源文件夹内文件夹命名规则
上面说过res文件夹下的文件夹命名是有规矩的,否则会报类似“invalidresource directory name **”的错误提示,除了上表提供的缺省文件夹,一般可以用缺省文件夹名加短横线加配置相关的限定符构成需要的资源文件夹,用于区别不同屏幕分辨率、不同机型特点(是否带键盘等)以及不同的本地化资源等用处,详细参考API说明文档。 其中的values-zh-rCN就是中文简体资源包,用于本地化,至于其它就对照API说明文档来分析。一般项目缺省的资源文件夹名称就够了。
资源文件夹内的资源文件存放规则
由上面资源表可知,每个文件夹中存放的文件类型不仅有规定,而且对文件内容也是有严格要求的,曾经将一个定义布局的spinner.xml文件放置在res/values,结果就报“Invalid start tag *Layout spinner.xml”错误,并导致R.java没有生成;将该布局文件放置在res/color下面,虽然没有报错,但是原本的布局文件,不再是正确生成为形如“R.layout.spinner”的布局资源,而是生成为了“R.color.spinner”的颜色资源索引,具体如下所示
布局文件放置正确的R.java中代码
public static final class layout {
public static final int autocomplete=0x7f030000;
public static final int spinner=0x7f03000d;
}
布局文件放置错误的R.java中代码
public static final class color {
public static final int solid_blue=0x7f050001;
public static final int spinner=0x7f050004;
}
另外当一种资源定义XML文件放在不对应的res文件夹下,在可视化环境下,也就不能正确显示和编辑。
通过上述一些特性,我们可以猜测出android的aapt工具的工作原理,先是根据文件夹名来进行对资源文件和XML文件进行不同的解析和编译规则进行解析和编译,ADT工具也是根据具体文件夹名称调用不同的规则来可视化编辑和呈现。
使用eclipse IDE提供的框架来创建资源
由于Android资源文件和文件夹有那么多的规矩,所以新手还是建议用eclipseIDE提供的创建XML文件的框架来创建资源文件和资源文件夹即在你需要创建资源文件时,通过“File”“New”“Android XML file”就可以弹出如下的New Android XML File对话框,
选好工程,填好资源文件名,在“What type of resourcewould you like to create”中勾选需要创建的资源类型,假如是非缺省目录资源就在“what type of resource configuration would you like?”添加需要的配置类型,就可以在“Folder”中自动生成资源xml所在的文件夹,这个不用修改它。其它就根据需要来选择,然后点击“Finish”,就可以创建出符合规则的资源文件了。在这里需要注意的是资源文件名不能使用大写字母。
布局资源(Layout)
布局资源是放置于/res/layout/下面的用于定义UI界面的XML文件,该资源被用于Activity或者其他UI组件。由于我在学习android之前,没有过Java GUI开发的经验,所以不清楚Java里面的UI设计思想,只知道Android UI类都是基于View和ViewGroup两个类,View类的子类就是“widget”即类似文本框、编辑框等UI控件,ViewGroup的子类就是“Layout”即LinearLayout、RelativeLayout等布局容器类。布局容器类里面可以布局UI控件和其它布局容器对象。具体结构如下所示
这和Symbian里面控件和视图概念有些区别,Symbian里面所有的UI类都是派生自CCoeControl,即一个控件可以成为另一个控件的容器。在Android中容器就是容器,控件就是控件,只不过容器中除了能放置控件外,也能放置容器,这为我们创建自有复杂的界面提供了条件。
Android提供了多种布局类型,列表如下
布局类型 |
布局标签 |
说明 |
线性布局 |
LinearLayout |
按照垂直或水平方向布置控件,每行或列只能放置一个控件 |
帧布局 |
FrameLayout |
从屏幕左上角布置控件,不能控制位置,多个控件会叠加放置 |
相对布局 |
RelativeLayout |
布局内的view组件元素按照依赖关系相对位置来放置,位置计算只执行一次,因此必须按依赖反向安排组件顺序 |
绝对布局 |
AbsoluteLayout |
按照绝对坐标(即x,y)来布局控件(相对用的不多) |
表格布局 |
TableLayout |
按照行列方式布局控件,类似于HTML里的Table |
切换卡 |
TabWidget |
实现标签切换的功能,是一个派生自LinearLayout的布局方式 |
可绘制资源(Drawable资源)
其实上面用到的逐帧动画,就是可绘制资源的中的一种,绘制资源涉及的资源类型比较多,详细列表说明如下
资源类型 |
资源描述 |
Bitmap File |
图像文件( .png 、 .jpg 或 .gif ) |
XML Bitmap |
为图像文件增加了描述的XML文件(当然描述跟下面罗列的类型不一样) |
Nine-Patch File |
一种可基于Content伸缩的PNG文件(.9.png) |
Layer List |
定义了一组按顺序绘制可绘制资源的XML文件 |
State List |
定义了因不同状态而调用不同图像文件的XML文件 |
Level List |
定义了不同level图片的XML文件,主要用于类似电量、信号等类似情况 |
Transition Drawable |
定义了两张图片,让其在规定时间内渐变的XML文件 |
Inset Drawable |
定义一个内嵌图片的XML(可设置四边距),通常给控件做内插背景用 |
Clip Drawable |
定义一个图片的XML,该图片资源可以根据level等级来剪取需要显示比例内容 |
Scale Drawable |
定义一个图片的XML,该图片可以根据level等级进行缩放 |
Shape Drawable |
定义了绘制颜色和渐变的几何形状的XML文件 |
Animation Drawable |
定义了逐帧动画的XML文件,在上面动画资源中讲解过了 |
Color |
定义了绘制颜色值的XML,感觉同values内的color一样,只是调用形式有点区别 |
综合来说,可绘制资源可以大致分为三类:
直接图片资源类,该类都是图像文件,有Bitmap File和Nine-Patch File,而且图像文件,API文档虽然说.png 、 .jpg 或 .gif 格式都支持,但是也提议 .png (最佳)、 .jpg (可接受)、 .gif (不要)的原则,另外考虑到aapt编译资源时会考虑优化,所以如果图像要绝对保真,还是将图像文件放置在res/raw目录下的比较好;
图像描述类,该类涉及对一个或多个图像文件进行添加配置和重新定义,都是XML资源描述文件,其中包括Layer List、State List、Level List、Transition Drawable、Inset Drawable、Clip Drawable、Scale Drawable、Animation Drawable这几类,通常这些资源或被用作控件view的填充图像,或被用作控件view的背景;
直接绘图类,该类也是资源定义XML文件,主要是Shape Drawable类和color类。
由于资源细分类型众多,对于直接图片类资源就不做展开介绍了,对于图像描述类资源,只选取了Clip Drawable和Scale Drawable两类的用例来简单说明下,对于直绘类则采用了Shape Drawable类的用例来简单介绍,其它可详细参阅API文档。
风格和主题资源(style&theme)
风格和主题的语法其实是一样的,只是运用环境不一样。
Theme是针对窗体级别的,改变窗体样式;
Style是针对窗体元素级别的,改变指定控件或者Layout的样式。
Android系统的themes.xml和style.xml(位于/base/core/res/res/values/)包含了很多系统定义好的style,一般使用系统的就可以了,需要扩展也是建议在里面挑个合适的,然后再继承修改。
资源文件中一些属性概念的区分
在资源中有很多相似或者有点容易混淆的属性概念,在这个小结的末尾对碰到的补充说明下。
android:gravity VS android:layout_gravity
gravity是用于对齐的标签,其中android:gravity属性是针对控件view内容的限定。比如一个button上面的text,你可以设置该text在view的靠左或靠右等位置,该属性起到这个作用。
android:layout_gravity属性是用来设置该控件相对于父view 的位置的限定。比如一个button在linearlayout里,你想把该button放在靠左或靠右等位置就可以通过该属性来设置。
padding VS margin
padding是填充的意思,指的是控件view中的内容(content)与控件view边缘的距离,也即控件内边距的属性关系;而margin表示的是控件外边距的关系,即控件view与ViewGroup的距离关系,在相对布局中控件与控件之间的相对位置距离关系。
目前先小结到这里,对于属性概念方面的内容,后面用到了再继续追加记录。
View的显示状态GONE,VISIBLE和INVISIBLE区别
很多网友可能会发现View类的设置显示状态setVisibility方法有三种情况,分别为GONE、VISIBLE和INVISIBLE,它们之间到底有哪些区别呢? Android123给大家举个简单的例子。可能很多网友会发现有些Android应用的下面包含了AdMob或Adsense广告条,如果这个View我们设置为GONE则消失,该广告条看不见也不占用位置。而INVISIBLE则代表广告条那块是空白,但仍然沾着他布局高和宽的位置,而VISIBLE 就是标准显示时的状态。
参考:http://www.cnblogs.com/hnrainll/archive/2012/11/21/2781121.html