Android中的资源
在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 DogThere are 3 DogsThere 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 DogsThere is 1 DogThere are 2 DogsThere 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.txtThis 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");
其他的都一样。
更多相关文章
- android双屏显示的一些修改与尝试
- Android常用加密手段之MD5加密(字符串加密和文件加密)
- Android常用的数据加密方式代码详解
- AndroidStudio快捷键和使用相关
- Android(安卓)Launcher研究(一)-----------图文详解手把手教你在
- 一行代码使Android状态栏变沉浸式透明化
- Android(安卓)NDK开发之入门示例 用C++ 写一个能四则运算的计算
- Android(安卓)Developers:指定在线程中运行的代码
- Android(安卓)Frame动画概述及示例