您的位置:华清远见教育科技集团 >> Android资料 >> Android开发之资源文件  
 
Android开发之资源文件
分享到:

资源文件是在代码中使用到的并且在编译时被打包到应用程序的附加文件。Android支持多种不同的文件,包括XML、PNG和JPEG文件。而Android平台中会存在很多不同的资源和资源定义文件。每一种资源定义文件的语法和格式及保存的位置取决于其依赖的对象。通常,创建资源可以通过以下3种文件:XML文件(除位图和原始格式文件外),位图文件(作为图片)和原始格式文件(所有其他的类型,比如声音文件)。

XML(eXtensible Markup Language),主要用来存储数据,使得其易于在任何应用程序中读写数据,虽然不同的应用软件也可以支持它的数据交换格式。事实上,在Android程序中有两种不同类型的XML文件:一种是作为资源被编译进应用程序;另一种是作为资源的描述,被应用程序使用。表7-2详细说明了这些资源文件的类型和结构。

表7-2 资源文件

目录 资源类型
res/anim XML文件编译为桢序列动画或者自动动画对象
res/drawable 使用Resources.getDrawable(id)可以获得资源类型。png、9.png、.jpg文件被编译为Drawable资源子类型:
* 位图文件。
* 9-patchs(可变位图文件)
res/layout 资源编译为屏幕布局器
res/values XML 文件可以被编译为多种资源 注意:不像其他res下的目录,这个目录可以包含多个资源描述文件。XML文件元素类型控制着这些资源被R类放置在何处。
这些文件可以自定义名称。这里有一些约定俗成的文件:
  * arrays.xml 定义数组。
  * colors.xml 定义可绘制对象的颜色和字符串的颜色。使用Resources.getDrawable()和Resources.getColor()都可以获得这些资源。
  * dimens.xml 定义尺度。使用Resources.getDimension()可以获得这些资源。
  * strings.xml 定义字符串(使用Resources.getString()或者更适合的Resources.getText()方法获得这些资源。Resources.getText()方法将保留所有用于描述用户界面样式的描述符,保持复杂文本的原貌。
  * styles.xml 定义样式对象
res/xml 自定义的XML文件。这些文件将在运行时编译进应用程序,并且使用Resources.getXML()方法可以在运行时获取
res/raw 自定义的原始格式资源,将被直接复制给设备。这些文件将不被压缩至应用程序。使用带有ID参数的Resources.getRawResource()方法可以获得这些资源,比如R.raw.somefilename

由表7-2可看出,有多种不同的XML文件,XML文件描述的内容不同则决定了其不同的格式。这些文件将描述文件支持的类型、语法或格式等。

下面我们就通过ResourceFileDemo示例来了解如何在程序运行时访问资源文件。ResourceFileDemo示例用户界面如图7-7所示。

 
图7-7 ResourceFileDemo示例用户界面图

在图7-7所示界面中,当用户单击“读取原始文件”按钮时,程序将读取/res/raw/raw_file.txt文件,并将内容显示在界面上。当用户单击“读取XML文件”按钮时,程序将读取/res/xml/people.xml文件,并将内容显示在界面上。

读取原始格式文件,首先需要调用getResource()方法获得资源对象,其次通过调用资源对象的openRawResource()方法,以二进制流的形式打开指定的原始格式文件。在读取文件结束后,调用close()方法关闭文件流。

ResourceFileDemo示例中关于读取原始格式文件的核心代码如代码清单7-18所示。

代码清单7-18 ResourceFileDemo示例读取原始格式文件核心代码


Resources resources = this.getResources();
    InputStream inputStream = null;
    try {
        inputStream = resources.openRawResource(R.raw.raw_file);
        byte[] reader = new byte[inputStream.available()];
        while (inputStream.read(reader) != -1) {
        }
        //以UTF-8的编码方式,从字节数组中实例化一个字符串
        displayView.setText(new String(reader,"utf-8"));
    } catch (IOException e) {
        Log.e("ResourceFileDemo", e.getMessage(), e);
    } finally {
        if (inputStream != null) {
            try {
                inputStream.close();
            }
            catch (IOException e) { }
        }
    }

下面介绍一下如何在程序运行时读取/res/xml目录下的XML文件。

首先,在/res/xml目录下创建一个名为people.xml的文件,XML文件定义了多个<person>元素,每个<person>元素都包含三个属性name、age和height,分别表示姓名、年龄和身高。/res/xml/people.xml文件代码如代码清单7-19所示。

代码清单7-19 people.xml


<people>
        <person name="李某某" age="21" height="1.81" />
        <person name="王某某" age="25" height="1.76" />
        <person name="张某某" age="20" height="1.69" />
    </people>

然后,读取XML格式文件。通过调用资源对象的getXml()方法,获取到XML解析器XmlPullParser,XmlPullParser是Android平台标准的XML解析器,这项技术来自一个开源的XML解析API项目XMLPULL。ResourceFileDemo示例中关于读取XML文件的核心代码如代码清单7-20所示。

代码清单7-20 ResourceFileDemo示例读取XML文件的核心代码


//通过资源对象的getXml()方法获取到XML解析器
    XmlPullParser parser = resources.getXml(R.xml.people);
    String msg = "";
    try {
        //parser.next()方法可以获取到高等级的解析事件,并通过对比确定事件类型
        while (parser.next() != XmlPullParser.END_DOCUMENT) {
            //使用getName()方法获得元素的名称
            String people = parser.getName();
            String name = null;
            String age = null;
            String height = null;
            if ((people != null) && people.equals("person")) {
                //使用getAttributeCount()方法获取元素的属性数量
                int count = parser.getAttributeCount();
                for (int i = 0; i < count; i++) {
                    //通过getAttributeName()方法得到属性名称
                    String attrName = parser.getAttributeName(i);
                    String attrValue = parser.getAttributeValue(i);
                    //分析属性名获取到正确的属性值
                    if ((attrName != null) && attrName.equals("name")){
                        name = attrValue;
                    } else if ((attrName != null) && attrName.equals("age")) {
                        age = attrValue;
                    } else if ((attrName != null) && attrName.equals("height")) {
                        height = attrValue;
                    }
                }
                //将属性值整理成需要显示的信息
                if ((name != null) && (age != null) && (height != null)) {
                    msg+="姓名:"+name+",年龄:"+age+",身高:"+height+"\n";
                }
            }
        }
    } catch (Exception e) {
        Log.e("ResourceFileDemo", e.getMessage(), e);
    }
    displayView.setText(msg);

这里介绍一下XmlPullParser的XML事件类型,如表7-3所示。

表7-3 XmlPullParser的XML事件类型

事件类型 说明
START_TAG 读取到标签开始标志
TEXT 读取文本内容
END_TAG 读取到标签结束标志
END_DOCUMENT 文档末尾
 更多相关文章

·Android开发之文件外部存储
·Android开发之文件内部存储
·Android开发之数据共享(ContentProviders)
·Android开发之数据操作(SQLiteDatabase)
·Android开发之手动建立SQLite数据库