处理任意的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; 
       case XmlPullParser.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。

相关链接: 我的Android开发相关文章

转自http://blog.csdn.net/flowingflying/article/details/9149527

【转】Pro Android学习笔记(四):了解Android资源(下)的更多相关文章

  1. Android学习笔记四十Preference使用

    Preference直译为偏好,博友建议翻译为首选项.一些配置数据,一些我们上次点击选择的内容,我们希望在下次应用调起的时候依旧有效,无须用户再一次进行配置或选择.Android提供preferenc ...

  2. Android 学习笔记四:创建工具栏按钮

    原文:http://blog.csdn.net/lihongxun945/article/details/48951199 前面我们已经可以在一个Activity中添加一些按钮之类的组件.由于手机的屏 ...

  3. android学习十四(android的接收短信)

    收发短信是每一个手机主要的操作,android手机当然也能够接收短信了. android系统提供了一系列的API,使得我们能够在自己的应用程序里接收和发送短信. 事实上接收短信主要是利用我们前面学过的 ...

  4. Android学习笔记:对Android应用进行单元测试

     第一步:在AndroidManifest.xml中加入如下两段代码: <manifest xmlns:android="http://schemas.android.com/ap ...

  5. android学习笔记40——国际化和资源自适应

    国际化——Internationalization,简称I18N. 本地化——Localization,检查L10N. java国际化资源的思路: java提供国际化资源的思路,是将程序中的标签.提示 ...

  6. android学习笔记39——使用原始资源

    原始资源 android中没有专门提供管理支持的类型文件,都被称为原始资源.例如:声音资源... android原始资源存放位置: 1.res/raw,android SDK会处理该目录下的原始资源, ...

  7. Android学习笔记_51_转android 加载大图片防止内存溢出

    首先来还原一下堆内存溢出的错误.首先在SD卡上放一张照片,分辨率为(3776 X 2520),大小为3.88MB,是我自己用相机拍的一张照片.应用的布局很简单,一个Button一个ImageView, ...

  8. Android学习笔记之:android更新ui的几种经常用法

    Android主线程不能运行耗时操作.我们通常是在子线程中运行耗时操作, 我们在运行完耗时操作后,我们一般能够通过下面几种方式来实现ui界面的更新. 首先是布局文件: <LinearLayout ...

  9. android 学习笔记四:控件

    1.android:gravity 指定控件的基本位置,比如居中.居右等位置 Top:顶部 bottom:底部 left:居左 right:居右 center_vertical:垂直居中 center ...

  10. Android学习笔记四:activity的四种启动模式

    Activity有四种启动模式:standard,singleTop,singleTask,singleInstance. 1.standard:标准启动模式 默认模式,这个模式下启动的Activit ...

随机推荐

  1. 用汇编的角度剖析c++的virtual

    多态是c++的关键技术,背后的机制就是有一个虚函数表,那么这个虚函数表是如何存在的,又是如何工作的呢? 当然不用的编译器会有不同的实现机制,本文只剖析vs2015的实现. 单串继承 首先看一段简单的代 ...

  2. linux SPI驱动——spi core(四)

    一: SPI核心,就是指/drivers/spi/目录下spi.c文件中提供给其他文件的函数,首先看下spi核心的初始化函数spi_init(void). 1: static int __init s ...

  3. linux支持的machine-types

    在内核文件中arch/arm/tools/mach-types定义目前内核支持的板卡.芯片等: ##machine_is_xxx  CONFIG_xxxx  MACH_TYPE_xxx  number ...

  4. NorFlash linux分区分析

    一般情况下,与板卡相关的内容都在bsp中(即arch/arm/mach-xxx/board-xxx.c)中,但norflash的分区直接放在norflash驱动中.由于norflash应用基于mtd, ...

  5. 必会必知git

    git必会必知   1 前言 git前身是BitKeeper,但是他不是开源软件,不符合当时开源趋势,于是就会有了开源的git,git开发只用了十天时间.目前git是公司开发必不可少的一个工具,用于多 ...

  6. cocos2d-x 下使用加密 sqlite3

    sqlite3 加密库用的是wxsqlite3-3.0.0.1 提取出来的, 在android 下測试通过,无异常 编译时仅仅须要编译  sqlite3secure.c  此文件,即能够成功.測试时生 ...

  7. Struts2 ModelDriven接口使用

    用户在做http请求时一般都有两种方式:get和post方式.get方式用来获取查询相关信息,既向服务器获得信息,而post方式用来更新信息既向服务器提交数据.通常情况下,用get方式向服务器获取信息 ...

  8. Tomcat Server 配置

    Tomcat报错: The JRE could not be found. Edit the server and change the JRE location. EClipse -> win ...

  9. [Python]Pip换源以及设置代理

    Install python package with proxy sudo pip install python-magic --proxy=https://your-proxy.com 2.No ...

  10. 1000个圆点与PaintDC的使用,OnSize时重画很棒

    import wx import random class View(wx.Panel): def __init__(self, parent): super(View, self).__init__ ...