资源是Android应用程序中重要的组成部分。在应用程序中经常会使用字符串、菜单、图像、声音、视频等内容,都可以称之为资源。通过将资源放到与apk文件中与Android应用程序一同发布,在资源文件比较大的情况下,可以通过将资源作为外部文件来使用,我们将分析如何在Android应用程序中存储这些资源。

一、资源的存储

在android中,资源大多都是保存在res目录中,例如布局资源以XML文件的形式保存在res/layout目录中;图像资源保存着res/drawable目录中;菜单资源保存在res/menu目录中。ADT在生成apk文件时,这些目录中的资源都会被编译,然后保存到apk文件中。如果将资源文件放到res/raw目录中,资源将在不编译的情况下放入apk文件中。在程序运行时可以使用InputStream来读取res/raw目录中的资源。

如果使用的资源文件过大,我们可以考虑将资源文件作为外部文件单独发布。Android应用程序会从手机内存或者SD卡读取这些资源文件。

二、资源的种类

从资源文件的类型来划分,我们可以将资源文件划分为XML、图像和其它。以XML文件形式存储的资源可以放在res目录中的不同子目录里,用来表示不同种类的资源;而图像资源会放在res/drawable目录中。除此之外,可以将任意的资源嵌入Androidy应用程序中。比如音频和视频等,一般这些资源放在res/raw目录中。

表1、 Android支持的资源
目录资源类型描述
Res/valuesXML 保存字符串、颜色、尺寸、类型、主题等资源,可以是任意文件名。对于字符串、颜色、尺寸等信息采用
Key-value形式表示,对于类型、主题等资源,采用其它形式表示
Res/layoutXML 保存布局信息。一个资源文件表示一个View或ViewGroup的布局
Res/menuXML 保存菜单资源。一个资源文件表示一个菜单(包括子菜单)
Res/animXML 保存与动画相关的信息。可以定义帧(frame)动画和补间(tween)动画
Res/xmlXML 在该目录的文件可以是任意类型的XML文件,这些XML文件可以在运行时被读取。
Res/raw任意类型 在该目录中的文件虽然也会被封装在apk文件中,但不会被编译。在该目录中可以放置任意类型的文件,例如,各种类型的文档、音频、视频文件等
Res/drawable图像 该目录中的文件可以是多种格式的图像文件,例如,bmp、png、gif、jpg等。在该目录中的图像不需要分辨率非常高,aapt工具会优化这个目录中的图像文件。如果想按字流读取该目录下的图像文件,需要将图像文件放在res/raw目录中。
assets任意类型 该目录中的资源与res/raw中的资源一样,也不会被编译。但不同的是该目录中的资源文件都不会生出资源ID

三、资源文件的命名

每一个资源文件或资源文件中的key-value对都会在ADT自动生成的R类(在R.java文件中)中找到相对应的ID.其中资源文件名或key-value对中的key就是R类中的java变量名。因此,资源文件名好key的命名首先要符合java变量的命名规则。

除了资源文件和key本身的命名要遵循相应的规则外,多个资源文件和key也要遵循唯一的原则。也就是说,同类资源的文件名或key不能重复。例如,两个表示字符串资源的key不能重复,就算这两个key在不同的XML文件中也不行。

由于ADT在生成ID时并不考虑资源文件的扩展名,因此,在res/drawable、res/raw等目录中不能存在文件名相同,扩展名不同的资源文件。例如在res/drawable目录不能同时放置icon.jpg和icon.png文件。

四、资源使用示例

在Android SDK中不仅提供了大量的系统资源,而且还允许开发人员定制自己的资源。不管是系统资源,还是自定义的资源,一般都会将这些资源放在res目录中,然后通过R类中的相应ID来引用这些资源。接下来将针对于XML类资源的使用进行分析。

XML资源实际上就是XML格式的文本文件,这些文件必须放在res/xml目录中。可以通过Resources.getXml方法获得处理指定XML文件的XmlResourceParser对象。实际上,XmlResourceParser对象处理XML文件的的过程主要是针对不同的状态点处理相应的代码,比如开始分析文档、开始分析标签、分析标签完成等,XmlResourceParser通过调用next方法不断更新当前的状态。

下面的代码,则是展示如何读取res/xml目录中的XML文件的内容,先在res/xml目录中建立一个xml文件。将AndroidManifest.xml文件复制到res/xml目录中,并改名为android.xml。

在准备完XML文件后,在onCreate方法中开始读取XML文件的内容,代码如下:

public void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.main);TextView textView=(TextView)findViewById(R.id.textview);StringBuffer sb=new StringBuffer();// 获得处理android。xml文件的XmlResourceParser对象XmlResourceParser xml=getResources().getXml(R.xml.android);try{ //切换到下一个状态,并获得当前状态的类型 int eventType =xml.next(); while(true) { //文档开始状态 if(eventType == XmlPullParser.START_DOCUMENT) { Log.d("start_document","start_document"); } //标签开始状态 else if(eventType ==XmlPullParser.START_TAG) { Log.d("start_tag",xml.getName()); //将标签名称和当前标签的深度(根节点的depth是1,第2层节点的depth是2,类推) sb.append(xml.getName()+"(depth:"+xml.getDepth()" "); //获得当前标签的属性个数 int count=xml.getAttributeCount(); //将所有属性的名称和属性值添加到StringBuffer对象中 for(int i=0;i<count;i++) { sb.append(xml.getAttributeName(i)+": "+xml.getAttributeValue(i)+""); } sb.append(")/n"); } //标签结束状态 else if(eventType ==XmlPullParser.END_TAG) { Log.d("end_tag",xml.getName()); } //读取标签内容状态 else if(eventType ==XmlPullParser.TEXT) { Log.d("text","text"); } //文档结束状态 else if(eventType ==XmlPullParser.END_DOCUMENT) { Log.d("end_document","end_document"); //文档分析结束后,退出while循环 break; }//切换到下一个状态,并获得当前状态的类型 eventType =xml.next(); } textView.setText(sb.toString());   } catch(Exception e)  {} }

更多相关文章

  1. Android APK 扩展文件
  2. Android颜色值XML文件
  3. android 查看apk中资源文件
  4. Android 根文件系统启动分析
  5. Android xml资源文件animal动画解析
  6. Android 文件操作
  7. Android 之 资源自适应与国际化
  8. android 状态栏移动到底部

随机推荐

  1. Android(安卓)Studio 快捷键 for Mac OS
  2. Git diff代码比较的高级技巧
  3. Android(安卓)拍照功能详解
  4. 关于Android(安卓)的系统架构
  5. android调用MySQL时遇到的一些问题
  6. Android复制粘贴详解
  7. 安卓 SQLite数据库操作实例
  8. Android(安卓)Activity启动模式之standar
  9. android开发handler与线程的用法
  10. Android控件系列之Button以及Android监听