文档章节

Android中的资源

双子座
 双子座
发布于 2012/05/30 14:23
字数 2399
阅读 980
收藏 8

在Android中,Resource是指文件或者是一系列的值。文件包括声音文件、图片、配置文件等。而一系列的值可能是字符串String、颜色、布局等。

使用资源,我们可以不重新编译代码就达到修改程序的目的。例如,在程序运行中需要一个字符串,而这个字符串是作为资源放在程序中的。在代码中使用的是这个字符串对应的ID,只需要在资源中修改这一字符串,则不重新编译就运行程序,显示就会发生相应的变化。

1、String资源:

String资源是放在一个或多个XML文件中的。XML文件名字可以是任意的,但是通常会命名为strings.xml。例如在创建了一个简单的Hello World工程后,在工程的res/values目录下就会自动创建一个strings.xml文件,使用默认的打开方式,即Android Common XML Editor,如下:

由上图可见这个文件中定义了两个string,选择其中 app_name,会在右边显示这个string的详细信息,将其看成是Java中的Hashtable,右边的Name表示这个String的key,Value表示它的值。使用Android Common XML Editor可以很方便的定义和添加String。在下方选择strings.xml标签,则会以普通xml的方式显示:

<?xml version="1.0" encoding="utf-8"?>
<resources>

    <string name="hello">Hello World, HelloWorldActivity!</string>
    <string name="app_name">Hello World</string>

</resources>

当strings.xml文件创建或更新,Eclipse的ADT插件会自动创建或更新工程中的R.java。在R.java中会看到类似于下面的代码:

public static final class string {
    public static final int app_name=0x7f040001;
    public static final int hello=0x7f040000;
}

上面的代码为每个String定义了int型的ID,在其他的地方使用这些ID号,只需:

R.string.hello

2、Layout资源:

Layout资源在Android中是用来进行布局管理的。Hello World的主类如下:

package com.hello;

import android.app.Activity;
import android.os.Bundle;

public class HelloWorldActivity extends Activity {
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
    }
}

有一行代码

setContentView(R.layout.main);

即是用来设置当前的布局。这行代码使用了R.layout.main资源,在R.java中有代码:

public static final class layout {
    public static final int main=0x7f030000;
}

这里的main就是上面使用的那个资源。

在工程中的res/layout中有一个main.xml文件,这个是默认的Layout资源使用默认方式打开它,如下图:

在打开的窗口中我们可以可视化的设计界面。单击下面的main.xml标签,看到xml文件的内容:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical" >

    <TextView
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="@string/hello" />

</LinearLayout>

如果程序有多个视图,则需要创建多个Layout资源文件。

3、引用资源的语法:

在Java源代码中,Android中的资源是通过ID号唯一标识的。

例如上面的代码,

android:text="@string/hello"

这一行用来设置TextView中的文本,"@string/hello"这个字符串就表示的引用R.java中的ID。

上面的那一行代码是引用一个已经存在的ID号。如果在main.xml的最后一行</LinearLayout>之前添加代码:

<Button android:id="@+id/b1"
android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:text="@string/hello" />

第一行表示使用一个Button,其ID为@+id/b1,前边的+表示如果没有这个资源就创建它。保存main.xml,打开R.java,会发现多了几行代码:

public static final class id {
    public static final int b1=0x7f050000;
}

这个就是根据Button android:id="@+id/b1"自动生成的资源标识。

如果不想使用+号,则需要先定义这个资源,但是不必指明具体信息:

<resources>
    <item type="id" name="Text"/>
</resources>

这里使用了item标签。之后,把Button android:id="@+id/b1"改成

Button android:id="@id/b1"

再次保存所有文件,打开R.java,会发现代码发生了相应的变化:

public static final class id {
    public static final int Text=0x7f050000;
}

个人理解<item type="id" name="Text"/>这句相当于声明一个变量。

4、String Array资源:

在res/values目录下的一个xml文件中定义字符串数组,格式如下:

<string-array name="stringArray">
    <item >firstString</item>
    <item >secondString</item>
    <item >thirdString</item>
</string-array>

上面的XML代码定义了一个字符串数组,名称为stringArray,其中包含了三个字符串。

有了这些字符串资源,就可以在Java代码中使用这些资源了,如下:

Resources res = activityInstance.getResources();
String strings[] = res.getStringArray(R.array.stringArray);

activityInstance表示程序中的某个Activity的一个实例。通过上面的代码,strings中存储的就是资源stringArray中的字符串。

5、Plurals资源:

Plurals资源是指一组字符串,这些字符串在格式上大体是相同的,除了表示数量的数字。例如:

There is 1 Dog
There are 3 Dogs
There are 0 Dogs

上面的三个字符串中的后两个只有数字是不同的,格式都是

There are x Dogs

而在创建资源的时候我们也不知道有多少个这样的字符串,也不知道x是多少。在资源xml文件中可以这样创建:

<plurals name="howManyDogs">
    <item quantity="one">There is 1 Dog</item>
    <item quantity="other">There are %d Dogs</item>
</plurals>

这样定义了两种字符串,因为第一个不能使用Dog的复数格式。使用这种资源的代码如下:

Resources res = activityInstance.getResources();
String s0 = res.getQuantityString(R.plurals.howManyDogs, 0, 0);
String s1 = res.getQuantityString(R.plurals.howManyDogs, 1);
String s2 = res.getQuantityString(R.plurals.howManyDogs, 2, 2);
String s9 = res.getQuantityString(R.plurals.howManyDogs, 9, 9);

这样,s0、s1、s2和s9的内容分别是:

There are 0 Dogs
There is 1 Dog
There are 2 Dogs
There are 9 Dogs

6、特殊String资源:

之前讲的字符串资源是最常见的,有时候我们需要用到特殊格式的字符串,例如形如html格式的、带引号的字符串等。例如下面的代码创建了几种特殊的字符串资源:

<string name="quoted_string">quoted \'xyz\' string</string>
<string name="double_quoted_string">\"double quotes\"</string>
<string name="java_format_string">%1$s, %2$s!</string>
<string name="tagged_string">
    Hello <b><i>World</i></b>, Bold.
</string>

要使用这些字符串资源,代码如下:

Resources res = activityInstance.getResources();
String s1 = res.getString(R.string.quoted_string);
String s2 = res.getString(R.string.double_quoted_string);
String javaFormatString = this.getString(R.string.java_format_string);
String s3 = String.format(javaFormatString, "Hello", "World");
String htmlTaggedString = this.getString(R.string.tagged_string);
Spanned textSpan = android.text.Html.fromHtml(htmlTaggedString);

这样,s1到s3中的内容依次是:

quoted 'xyz' string
"double quotes"
Hello, World!

而textSpan中的内容是

Hello World, Bold.

并且World是斜粗体。

7、Color资源:

在res/values目录下可以创建一个xml文件用于创建Color资源。创建Color资源的代码如下:

<color name="red">#f00</color>
<color name="blue">#0000ff</color>
<color name="green">#f0f0</color>
<color name="main_back_ground_color">#ffffff00</color>

要想使用这些Color资源,代码是:

int mainBackGroundColor = res.getColor(R.color.main_back_ground_color);

8、Dimension资源:

Dimension资源的类型有Pixels,Inches以及Points。

创建Dimension资源的代码:

<dimen name="mysize_in_pixels">40px</dimen>
<dimen name="mysize_in_dp">5dp</dimen>
<dimen name="medium_size">100sp</dimen>

数字后面的单位表示:

px: 像素
in: 英寸
mm: 毫米
pt: 点
dp: 基于160dpi屏幕的密度
sp: 比例像素

使用Dimension资源:

float dimen = res.getDimension(R.dimen.mysize_in_pixels);

9、Image资源:

Android中的图像资源放在res/drawable目录下,支持的图片类型包括gif、jpg以及png。在R.java中这些图片资源的ID名就是图片文件的名字。

使用一个图片资源:

BitmapDrawable d = (BitmapDrawable) res.getDrawable(R.drawable.ic_launcher); 
textView.setBackgroundDrawable(d);

10、Color-Drawable资源:

Color-Drawable资源,简单的理解就是有颜色的矩形。例如:

<drawable name="red_rectangle">#f00</drawable>
<drawable name="blue_rectangle">#0000ff</drawable>
<drawable name="green_rectangle">#f0f0</drawable>

在使用时:

ColorDrawable red_rectangle = (ColorDrawable) res.getDrawable(R.drawable.red_rectangle); 
textView.setBackgroundDrawable(red_rectangle);

如果想要显示出来的是圆角矩形,则要在res/drawable目录下单独创建一个xml文件,例如round_rectangle.xml,内容如下:

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android" >
    <solid android:color="#f0600000"/>
    <stroke android:width="3dp" color="#ffff8080"/>
    <corners android:radius="13dp"/>
    <padding android:left="10dp" android:top="10dp"
        android:right="10dp" android:bottom="10dp"/>
</shape>

在使用的时候:

GradientDrawable roundedRectangle = (GradientDrawable)res.getDrawable(R.drawable.round_rectangle); 
textView.setBackgroundDrawable(roundedRectangle);

11、XML文件资源:

XML文件资源放在res/xml目录下。例如有个test.xml文件,其内容如下:

<?xml version="1.0" encoding="UTF-8"?>
<学生花名册>
    <学生 性别 = "男">
         <姓名>李华</姓名>
         <年龄>14</年龄>
     </学生>
     <学生 性别 = "男">
         <姓名>张三</姓名>
         <年龄>16</年龄> 
     </学生>
</学生花名册>

想要分析它,则要使用XmlPullParser,写一个方法:

private String getEventsFromAnXMLFile(Activity activity)
        throws XmlPullParserException,IOException { 
    StringBuffer sb = new StringBuffer(); 
    Resources res = activity.getResources(); 
    XmlResourceParser xpp = res.getXml(R.xml.test);
    xpp.next(); 
    int eventType = xpp.getEventType(); 
    while (eventType != XmlPullParser.END_DOCUMENT){  
        if(eventType == XmlPullParser.START_TAG){
            if(xpp.getName().equals("学生")){
                sb.append(xpp.getAttributeValue(0)+"\t"); 
            }
        }  
        else if(eventType == XmlPullParser.END_TAG){
            if(xpp.getName().equals("学生")){
                sb.append("\n"); 
            }
        }  
        else if(eventType == XmlPullParser.TEXT){ 
           sb.append(xpp.getText()+"\t"); 
        } 
        eventType = xpp.next(); 
    }
    return sb.toString(); 
}

在主函数中调用这个方法:

String str = this.getEventsFromAnXMLFile(activityInstance);

则str中的内容是:

男 李华 14
男 张三 16

12、Raw资源:

Raw资源包括声音、视频或者是文本文件,放在工程的res/raw目录下。

例如在res/raw目录下有一个文本文件test.txt,其内容为:

res/raw/test.txt
This is a text file
这是一个文本文件

想要读取其中的内容,可以定义方法:

String getStringFromRawFile(Activity activity)
        throws IOException{
    Resources r = activity.getResources();
    InputStream is = r.openRawResource(R.raw.test);
    //以下代码解决汉字乱码问题
    BufferedReader br = new BufferedReader(new InputStreamReader(is, "GB2312"));
    StringBuffer sb = new StringBuffer();
    String data = "";
    while ((data = br.readLine())!=null) { 
        sb.append(data+"\n");
    }
    is.close();
    br.close();
    String result = sb.toString();
    //去掉最后一个回车字符
    result = result.substring(0, result.length()-1);
    return result; 
}

在主类中使用这个方法:

String str = this.getStringFromRawFile(this);
textView.setText(str);

这样,str中的内就是test.txt文件中的内容。

13、使用Assets:

Assets放在工程的assets目录下,这个目录下的文件不会在R.java中产生ID,需要使用文件路径才能使用其中的文件。例如在assets目录下有个文本文件test.txt,要读取其中内容,只需修改上面的代码:

AssetManager am = activity.getAssets(); 
InputStream is = am.open("test.txt");

其他的都一样。

 

© 著作权归作者所有

双子座
粉丝 540
博文 78
码字总数 61009
作品 0
南京
程序员
私信 提问
加载中

评论(10)

刘平1
很好
iiiiiiiii
iiiiiiiii

引用来自“双子座”的评论

引用来自“Ghost_”的评论

不写ios的啦?

现在有点无所事事,以后会写iOS的

hehe
双子座
双子座 博主

引用来自“Ghost_”的评论

不写ios的啦?

现在有点无所事事,以后会写iOS的
iiiiiiiii
iiiiiiiii
不写ios的啦?
双子座
双子座 博主

引用来自“流逝的风”的评论

关于这方面最近我们一一直在研究。。。

如果能够一直做下去~
流逝的风
流逝的风
关于这方面最近我们一一直在研究。。。
双子座
双子座 博主

引用来自“西昆仑”的评论

博主记得回踩,你懂的~http://my.oschina.net/myspaceNUAA/blog

我懂的~
西昆仑
西昆仑
博主记得回踩,你懂的~http://my.oschina.net/myspaceNUAA/blog
双子座
双子座 博主

引用来自“西昆仑”的评论

NB~

过奖啊~
西昆仑
西昆仑
NB~
Android应用资源---绘制资源类型(Drawable)(二)

Nine-Patch NinePatch资源是一个PNG图片,在这个图片内能够定义拉伸区域,当在View对象的内容超过了普通图片的边框时,Android会缩放这个拉伸区域。通常,把这种类型的图片作为View对象的背景...

长平狐
2012/10/16
945
0
Android应用资源---绘制资源类型(Drawable)(六)

缩放可绘制资源 定义在XML中的一个可绘制资源,它能够基于自己当前的级别来改变另一个可绘制资源的尺寸。 文件位置(FILE LOCATION): res/drawable/filename.xml 文件名被用作资源ID。 被编...

长平狐
2012/10/16
285
0
【转】Android xml资源文件中@、@android:type、@*、?、@+含义和区别

一.@代表引用资源 1.引用自定义资源。格式:@[package:]type/name android:text="@string/hello" 2.引用系统资源。格式:@android:type/name android:textColor="@android:color/opaque_red......

mj4738
2011/12/27
718
1
Android 应用资源---访问资源(Accessing Resources)

一旦在应用程序中提供了资源,就能够通过引用资源ID来使用资源。所有的资源ID都在工程的R类中被定义,R类是由aapt工具自动生成的。 当应用程序被编译是,aapt会生成R类,它包含了res/目录中的...

长平狐
2012/10/16
105
0
Android应用资源---绘制资源类型(Drawable)(四)

级别列表 级别列表管理着一组可选择的绘制资源,被管理的每个资源都会给分配一个最大的数字值。调用setLevel()方法给装载在级别列表中的有android:maxLevel属性的绘制资源设置级别值。andro...

长平狐
2012/10/16
89
0

没有更多内容

加载失败,请刷新页面

加载更多

怎样在磁盘上查找MySQL表的大小?这里有答案

导读 我想知道 MySQL 表在磁盘上占用多少空间,但看起来很琐碎。不应该在 INFORMATION_SCHEMA.TABLES 中提供这些信息吗?没那么简单! 我想知道 MySQL 表在磁盘上占用多少空间,但看起来很琐碎...

问题终结者
39分钟前
6
0
jQuery load() 方法实现加载远程数据

jQuery load() 方法是简单但强大的 AJAX 方法。load() 方法从服务器加载数据,并把返回的数据放入被选元素中。 语法: $(selector).load(URL,data,callback);必需的 URL 参数规定您希望加载的...

前端老手
40分钟前
5
0
Spring Boot缓存实战 Redis 设置有效时间和自动刷新缓存-2

问题 上一篇Spring Boot Cache + redis 设置有效时间和自动刷新缓存,时间支持在配置文件中配置,说了一种时间方式,直接扩展注解的Value值,如: @Override@Cacheable(value = "people#${s...

xiaolyuh
49分钟前
10
0
怎样在磁盘上查找MySQL表的大小?这里有答案

我想知道 MySQL 表在磁盘上占用多少空间,但看起来很琐碎。不应该在 INFORMATION_SCHEMA.TABLES 中提供这些信息吗?没那么简单! 我想知道 MySQL 表在磁盘上占用多少空间,但看起来很琐碎。不应...

Linux就该这么学
今天
5
0
Redis

一、Redis支持的几种数据类型:字符串、List、SET、HASH、ZSET 二、Redis的缓存技术主要是为了降低关系数据库的负载并减少网站成本 三、在Redis里面,被MULTI命令和EXEC命令包围的所有命令会...

BobwithB
今天
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部