一、引言
在Android开发中,资源文件是我们使用频率最高的,无论是string,drawable,还是layout,这些资源都是我们经常使用到的,而且为我们的开发提供了很多便利;关于资源文件的使用操作,对于Android开发者来说也是非常重要的,主要包括文本字符串(strings)、颜色(colors)、数组(arrays)、动画(anim)、布局(layout)、图像和图标(drawable)、音频视频(media)和其他应用程序使用的组件。
二、资源种类
Android 有很多种类的资源,有7个是在res下新建目录然后将资源放在目录下:res/values,res/xml,res/layout,res/drawable,res/anim,res/menu,res/raw
目录 | 资源类型 | 描述 |
---|---|---|
res/values | XML | 保存字符串、颜色、尺寸、类型、主题等资源,可以是任意文件名。对于字符串、颜色、尺寸等信息采用key-value形式表示,对于类型、主题等资源,采用其他形式表示 |
res/layout | XML | 保存布局信息,一个资源文件表示一个View或者ViewGroup的布局 |
res/menu | XML | 保存菜单资源,一个资源文件表示一个菜单(包括子菜单) |
res/anim | XML | 保存与动画相关的信息,可以定义帧(frame)动画和补间(tween)动画 |
res/xml | XML | 在该目录中的文件可以是任意类型的XML文件,这些XML文件可以在运行时被加载 |
res/raw | 任意类型 | 在该目录的文件虽然也会被封装在apk文件中,但不会被编译,在该目录中可以放置任意类型的文件,例如,各种类型的文档、音频、视频文件等 |
res/drawable | 图像 | 该目录中的文件可以是多种格式的图像文件,例如bmp、png、gif、jpg等,在该目录中的图像不需要分辨率非常高,aapt工具会优化这个目录中的图像文件。如果想按字流读取该目录下的图像文件,需要将图像文件放在res/raw目录中 |
assets | 任意类型 | 该目录中的资源与res/raw中的资源一样,也不会被编译,但不同的是该目录中的资源文件都不会生成资源ID |
三、资源应用
3.1 在res/values中的文件
字符串(String)资源
无论字符串资源放在res/values目录下哪个资源文件中,在生成ID时都会放在R.string类中。这就意味着,字符串资源的key的唯一性的作用域是res/values目录下所有的资源文件
<string name="reference">abc</string>
代码引用
setText(R.string.reference);
格式化应用
<string name="age">王明今年 %1$d 岁</string>
textView.setText(String.format(mContext.getString(R.string.age), age));
格式化说明:
- %n$ms:代表输出的是字符串,n代表是第几个参数,设置m的值可以在输出之前放置空格
- %n$md:代表输出的是整数,n代表是第几个参数,设置m的值可以在输出之前放置空格,也可以设为0m,在输出之前放置m个0
- %n$mf:代表输出的是浮点数,n代表是第几个参数,设置m的值可以控制小数位数,如m=2.2时,输出格式为00.00
数组(Array)资源
数组资源包括字符串数组资源(string-array)和整数数组资源(integer-array)
<resources>
<string-array name="country">
<item>中国</item>
<item>美国</item>
<string-array>
<integer-array name="values">
<item>100</item>
<item>200</item>
<integer-array>
</resources>
代码示例:
String []country = getResources().getStringArray(R.array.country);
颜色(Color)资源
保存在资源文件中的颜色值用井口"#"开头
<resources>
<color name="red_color">#F00</color>
</resources>
在XML文件中引用:
android:textColor="@color/red_color"
在代码中引用:
setTextColor(getResources().getColor(R.color.red_color)) ;
尺寸(Dimension)资源
尺寸资源就是一系列的浮点数组成的资源,<dimen>标签用来定义尺寸资源
<resources>
<dimen name="title_size">50dp</dimen>
</resources>
在XML文件中引用:
android:textSize="@dimen/title_size"
在代码中引用:
float size = getResources().getDimension(R.dimen.title_size) ;
dp可以自适应屏幕的密度,dpi表示密度,而dip=dp;sp与比例无关的像素,除了自适应屏幕密度外,还会自适应用户设置的字体。
类型(Style)资源
类型资源实际上就是将需要设置相同值的属性提出来放在单独的地方,然后在每一个需要设置这些属性的组件引用这些类型,类型之间也可以继承,通过style标签的parent属性指定父类型的资源ID
<resources>
<style name="style1">
<item name="android:textSize">20sp</item>
</style>
<style name="style2" parent="@style/style1">
<item name="android:textColor">#FFFF00</item>
</style>
</resources>
XML文件中使用:
<TextView android:layout_width="fill_parent"
android:layout_height="full_parent"
android:text=""
style="@style/style2">
主题(Theme)资源
主题实际上也是类型,只是这种类型只能用于<activity>和<application>标签。其中<activity>用于定义Activity;<application>标签中使用主题,那么所有在<application>中定义的<activity>不过在<activity>中使用主题可以覆盖<application>的主题。主题也可以有继承,不过使用的形式是通过"."。
<resources>
<style name="style1">
<item name="android:textSize">20sp</item>
<item name="android:textColor">#FFFFFF</item>
</style>
<style name="style1.style2">
<item name="android:gravity">right</item>
</style>
<resources>
XML使用方式:
android:theme="@style/style1.style2"
颜色(Drawable)资源
配置文件与颜色资源类似,只是要使用<drawable>标签
<resources>
<drawable name="solid_blue">#0000FF</drawable>
<drawable name="solid_yello">#FFFF00</drawable>
<resources>
在XML中使用:
android:textColor="@drawable/solid_blue"
在代码中使用:
Drawable drawable = getResources().getDrawabale(R.drawable.solid_blue);
3.2 在res/drawable中的文件
在Android应用程序中经常使用到很多图像,这些图像资源必须放在res/drawable中,例如jpg、png、bmp、gif(不包括动画gif)。res/drawable目录除了可以放置普通的图像文件名,还可以放置一种叫Nine-Patch Images的图像文件,这种文件必须以9.png结尾,主要用于边框图像的显示。使用9-Patch格式的图像,无论图像大小如何变化,边框粗细会总保持不变。
3.3 放在res/anim中的文件
动画文件必须放在res/anim目录中,其中涉及到的图像文件仍然要放在res/drawable中。
3.4 在res/raw中的文件
放在res/raw目录中的资源文件称为RAW资源。该目录中的任何文件不会被编译。可以通过Resource.openRawResources方法获取指定文件的InputStream对象,然后把文件通过OutputStream写入SD卡:
InputStream is = getResources().openRawResources(R.raw.test);
3.5 在assets中的文件
assets资源与其他的资源都不一样。该资源所在的目录不在res目录中,而是与res平级的assets目录(这个目录的资源都不会生成资源ID)。因此,在读取这些资源文件时需要直接使用资源文件名。
例如在assets中有一个test.txt文件,以下是用代码读取该文件的方法:
try{
//打开test.txt文件,并获得读取该文件内容的InputStream对象
InputStream is = getAssets().open("test.txt");
byte [] buffer = new byte[1024];
int count = is.read(buffer);
String s = new String(buffer,0,count);
}
如果test.txt是在assets目录的test文件下,那么访问时候如下:
InputStream is = getAssets().open("test/test.txt");
3.6 在res/menu中的文件
其实现在比较少用到这个系统的菜单了,但了解下还是应该的。首行,菜单资源文件必须放在res/menu目录中。菜单资源文件必须使用<menu>标签作为根节点。除了<menu>标签外,还有另外两个标签用于设置菜单项和分组,这两个标签是<item>和<group>。<menu>标签没有任何属性,但可以嵌套在<item>标签中,表示子菜单的形式。不过<item>标签中不能再嵌入<item>标签。
<item>标签的属性含义如下:
- id: 表示菜单项的资源ID
- menuCategory: 同种菜单项的种类。该属性可取4个值:container、system、secondary和alternative。通过menuCategroy属性可以控制菜单项的位置。例如将属性设为system,表示该菜单项是系统菜单,应放在其他种类菜单项的后面。
- orderInCategor: 同种类菜单的排列顺序。该属性需要设置一个整数值。例如menuCategory属性值都为system的3个菜单项(item1、item2和item3)。将这3个菜单项的orderInCategory属性值设为3、2、1,那么item3会显示在最前面,而item1会显示在最后面
- title: 菜单项标题(菜单项显示的文本)
- titleCondensed: 菜单项的短标题。当菜单项标题太长时会显示该属性值
- icon: 菜单项图标资源ID
- alphabeticShortcut: 菜单项的字母快捷键
- numericShortcut: 菜单项的数字快捷键
- checkable: 表示菜单项是否带复选框。该属性可设计为true或false
- checked: 如果菜单项带复选框(checkable属性为true),该属性表示复选框默认状态是否被选中。可设置的值为true或false
- visible: 菜单项默认状态是否可视
- enable: 菜单项默认状态是否被激活
<group>标签的属性含义如下:
- id: 表示菜单组的ID
- menuCategory: 与<item>标签的同名属性含义相同。只是作用域为菜单组
- orderInCategory: 与<item>标签的同名属性含义相同。只是作用域为菜单组
- checkableBehavior: 设置该组所有菜单项上显示的选择组件(CheckBox或Radio Button)。如果将该属性值设为all,显示CheckBox组件;如果设为single,显示Radio Button组件;如果设为none,显示正常的菜单项(不显示任何选择组件)
- visible: 表示当前组中所有菜单项是否显示。该属性可设置的值是true或false
- enable: 表示当前组中所有菜单项是否被激活。该属性可设置的值是true或false
<menu xmlns:android="http://schemas.android.com/apk/res/android">
<item android:id=""/>
<group android:id="">
<item/>
<item/>
</group>
<item>
<menu>
</menu>
</item>
</menu>
在代码中使用,例:
public boolen onCreateOptionsMenu(Menu menu){
MenuInflate menuInflate = getMenuInflate();
menuInflate.inflate(R.menu.option_menu,menu);
return true;
}
3.7 在res/xml中的文件
XML资源实际上就是XML格式的文本文件。这些文件不需保存上res\xml目录中。可以通过Resources.getXML()方法获得处理指令XML文件的XMLResourcesParser对象。这个处理过程与SAX差不多,不同的就是SAX是基于事件模型,而XMLResourcesParser通过调用next方法不断更新当前的状态。例:
StringBuffer sb = new StringBuffer();
XmlResourceParser xml = getResources().getXML(R.xml.android);
try{
//切换到下一个状态,并获得当前状态的类型
int eventType = xml.next();
while(true){
//文档开始状态
if(eventType == XmlParser.START_DOCUNMENT){}
//标签开始状态
if(eventType == XmlParser.START_TAG){
//获得标签名字 xml.getName();
//获得当前标签的属性个数 int count = xml.getAttributeCount();
//获取当前标签所有属性的名称和属性值添加
for(int i=0;i<count;i++){
//属性名 xml.getAttributeName(i)
//属性值 xml.getAttributeValue(i)
}
}
//标签结束状态
if(eventType == XmlParser.END_TAG){}
//读取标签内容状态
if(eventType == XmlParser.TEXT){}
//文档结束状态
if(eventType == XmlParser.END_DOCUMENT){
//文档分析结束
break;
}
//关键一步!!!切换到一下状态判断
eventType = xml.next();
}
}
好吧,就写这么说了。