在Android开发中,资源包括文件或者值,它们和执行应用捆绑,无需在源代码中写死,因此我们可以改变或替换他们,而无需对应用重新编译。

asset/(相当于用户目录例如放txt文件)

res/

anim(动画)

drawable(selector,sharp)

layout

menu(菜单)

xml(普通xml)

values

value 类型

string

integer

bool

array

---

color

drawable

attr

ids(定义一个id在R文件中生成一个对应id,可以直接引用)

plurals

-----------------

dimen

style

string 说明

string资源可以带有输入,可以带有html格式



复数Plurals。这对中文而言没有什么意义,但是在英文中,有There is one egg. 和There are 5 eggs. 的区别。需要在信息表达方面进行区分对待,plurals就是针对此进行处理。



处理任意的XML文件

自定义的xml文件放置在res/xml/下,可以通过R.xml.file_name来获取一个XMLResourceParser对象。下面是xml文件的例子:

<rootname="tom"><--也可以是<root>,本次采用带参数的方式作为实验-->
<leaf>Hello from an elementtest.</leaf>
<leaf>Hello World!</leaf>
<cornersradius="13dp"/>
</root>

通过javacode对xml文件进行逐层解析,代码如下:

try{//防止在解析过程中,因xml文件书写或解析分析不匹配等原因造成的异常
XmlPullParser xpp =getResources().getXml(R.xml.rt_test);
//获取XML资源的对象

int eventType = xpp.next();//相当于xpp.next(); int eventType =xpp.getEventType(),而next()直接返回类型
while(eventType != XmlPullParser.END_DOCUMENT){//根据类型不同进行相应处理
switch(eventType){
caseXmlPullParser.START_DOCUMENT:
Log.d("xml","***************start****************");
break;
caseXmlPullParser.START_TAG:
int count = xpp.getAttributeCount();
Log.d("xml","starttap: " + xpp.getName() + "attribute number " +count);
for(int i = 0 ; i < count ; i ++){//此处处理<xxxx yy=zz….>中yy=zz的参数部分,要注意xml是允许这样编写,除非确定自定义的XML的schema中不纯正此方式
Log.d("xml","Attribute " + i +" : " + xpp.getAttributeName(i) +" = " +xpp.getAttributeValue(i));
}
break;
caseXmlPullParser.END_TAG:
Log.d("xml","endtap: " + xpp.getName());
break;
caseXmlPullParser.TEXT:
Log.d("xml","text: " + xpp.getText());
break;
default:
Log.d("xml","eventType= " + eventType);
break;
}
eventType = xpp.next();
}
Log.d("xml","***************end****************");
}catch(Throwable t){
Log.e("xml","testXMLget exception t : " +t.getMessage());
}

更详细的代码说明可以阅读Android学习笔记(三八):资源resource(上)、XML解析(XmlPullParser)。运行结果如下:

处理Raw资源

raw资源位于res/raw目录下,和其他的资源不同,不经过编译就打包到应用的apk中。raw文件可以为音频、视频等任何格式的文件。读取是和java的文件读取一直,不同的是通过R.raw.filename来获取。

protected void testRaw(){
try{//io读取,对异常的获取
InputStream is =getResources().openRawResource(R.raw.rt_test);//获取raw资源
readTextFile(is);
is.close();
}catch(Throwable t){
Log.e("raw","testRaw error : " + t.getMessage());
}
}

private void readTextFile(InputStream is) throwsIOException{
ByteArrayOutputStream baos = new ByteArrayOutputStream();
int ch =is.read();
while(ch !=-1){
baos.write(ch);
ch =is.read();
}
Log.d("raw",baos.toString());
//Log.d("raw",newString(baos.toByteArray(),"GB2312"));
}

处理Asset资源

asset资源是位于/assets目录下,该目录于/res目录平衡,即不在/res下面,所以不在R.java中形成相关的ID,不能通过ID来获取asset资源。/assets是应用的用户目录,类似linux用户中的~/目录。我们在改目录下放置文本文件tv_test.txt。下面是读取的代码。

protected void testAssets(){
try{
AssetManager am = getAssets();//通过AssetManager来获取/assets目录下的文件
InputStream is =am.open("vt_test.txt");//不使用ID,直接通过文件名来获取,又如”subbir/vt_test2.txt”
readTextFile(is);
is.close();
}catch(Throwable t){
Log.e("asset","testAsset Resource error : " + t.getMessage());
}
}

注意,getResource()和getAsset()都是activity下的方法,如activity.getResource()。

资源和配置的变更

资源有助于本地化,包括适配语言,横/竖屏、屏尺寸等等。在res中出了之前介绍的default文件夹,还可以有基于条件适配的文件夹,存放相同名字的XML文件,这些文件夹在R.java中具有相同的ID。Android根据实际情况,选择合适文件夹中的XML描述。例如:

\res\layout\main_layout.xml
\res\layout-port\main_layout.xml
\res\layout-land\main_layout.xml

当设备为竖屏时,则优先选择layout-port,其次为layout。带有条件的文件夹成为alternate resources,所带的条件,如上例子中的-port成为configuration qualifiers。这种带适配条件文件夹的格式为:缺省资源文件夹名-条件1[-条件2[-条件N...]]。具体的configuration qualifiers可以在:http://developer.android.com/guide/topics/resources/providing-resources.html#AlternativeResources中查找,下面列举部分:

mccAAA: AAA is the mobile country code.
mncAAA: AAA is the carrier/network code.
en-rUS: Language and region.
sw<N>dp, w<N>dp, h<N>dp: Smallest width, available width, available height (since API 13).
small, normal, large, xlarge: Screen size.
long, notlong: Screen type.
port, land: Portrait or landscape.
car, desk: Type of docking.
night, notnight: Night or day.
ldpi, mdpi, hdpi, xhdpi, nodpi, tvdpi: Screen density.
notouch, stylus, finger: Kind of screen.
keysexposed, keyssoft, keyshidden: Kind of keyboard.
nokeys, qwerty, 12key: Number of keys.
navexposed, navhidden: Navigation keys hidden or exposed.
nonav, dpad, trackball, wheel: Type of navigation device.
v3, v4, v7: API level.

这些条件是有优先级别的,在缺省资源文件夹名-条件1[-条件2[-条件N...]]中条件1的优先级别必须高于条件2的优先级别,同理条件2的优先级别必须高于条件3的优先级别。条件级别的高低是Android预先设定的,上面列举的各条件的优先级别就是从高到低。例如有以下的几个文件夹:/res/values,/res/values-en,/res/values-en-rUS,/res/values-port,/res/values-en-port。对于语言为美国英语(en-rUS)的竖屏情况下,Android通过ID查找资源的顺序为/res/values-en-rUS,/res/values-en-port,/res/values-en,/res/values-port,/res/values。

更多相关文章

  1. Android音乐播放器读取歌词.lrc文件乱码问题解决方法
  2. Android(安卓)Stuido 实现多渠道打包
  3. libgdx框架的配置
  4. Android下PM命令常见使用方法
  5. Android(安卓)开机动画动态替换
  6. 设置文本边框 与 边框的样式:
  7. android使用艺术字,自定义字体
  8. Android(安卓)每周必看资源
  9. android打开文件、保存对话框、创建新文件夹对话框

随机推荐

  1. Android(安卓)Listview 隐藏滚动条
  2. Android(安卓)postTranslate和preTransla
  3. Android中创建文件夹和文件的操作
  4. 2011.09.26(5)——— android sample之Note
  5. android 抓包
  6. Android之Input子系统事件分发流程
  7. Android中文API(139) —— SQLiteOpenHelpe
  8. Android(安卓)TextView 动态设置Drawable
  9. Android(安卓)-- 获取IP和MAC地址
  10. android 获取路径目录方法