转自:http://blog.csdn.net/fwwdn/article/details/7513925

在Android层次结构中,资源扮演着非常重要的角色。在Android中,资源是绑定到可执行程序的文件或值。这些文件和值绑定到可执行程序的方式很友好,无需重新编译和重新部署应用程序就能更改他们。熟悉的资源包括:字符串,颜色和位图等。下面分别介绍Android中资源的使用。

1、字符串资源

Android允许一个或多个xml文件中定义一个或多个字符串。这些xml文件位于/res/values目录下。文件名池可以任意指定,但常见的是类似strings.xml这样的。
如:

[html] view plain copy
  1. <?xmlversion="1.0"encoding="utf-8"?>
  2. <resources>
  3. <stringname="hello">HelloWorld,HandlerDemo!</string>
  4. <stringname="app_name">HandlerDemo</string>
  5. </resources>
文件中的name属性最终将成为R.java中的id。

2、布局资源
在Android中,屏幕的视图通常以资源的形式从xml文件中加载,这些xml文件称为布局资源。布局资源是Android UI编程中使用的一种主要资源。
如:
[html] view plain copy
  1. <?xmlversion="1.0"encoding="utf-8"?>
  2. <LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android"
  3. android:orientation="vertical"
  4. android:layout_width="fill_parent"
  5. android:layout_height="fill_parent"
  6. >
  7. <TextView
  8. android:id="@+id/textView"
  9. android:layout_width="fill_parent"
  10. android:layout_height="wrap_content"
  11. android:text="@string/hello"
  12. />
  13. </LinearLayout>
Android中需要为每个活动(Activity)定义一个独立的布局文件,更准确的讲每个布局需要一个专门的文件。如果绘制两个屏幕,可能需要两个布局文件,如:/res/layout/screen1_layout.xml和/res/layout/screen2_layout.xml。

在Activity中可以通过R.id.textView找到布局文件中的textview。id属性的值表示,将使用一个名为textView的常量来唯一标识次视图,以与该活动的其他视图相区别。@+id/textView的加号(+)表示,textView可能还不存在,如果确实是这样,则创建一个新id并将其命名为textView。

3、资源引用语法
@[package:]type/name
type对应R.java中一种可用资源类型命名空间,包括:
R.drawable
R.id
R.layout
R.string
R.attr
R.plural
R.array
XML资源引用语法中相应类型为:
Drawable
id
layout
string
attr
plurals
string-array

关于plural,我们知道不同的语言对数量的定义有不同的语法规则。例如,在英语中,1个指的是一种特殊情况。其他时候我们说n个。这种单数和复数的情况非常的普通。但其他语言却有明显的区别。Android中设置了0,1,2,"很少",“许多”和“其他”做为数量表述。
对于给定的语言和数量,决定使用那种情况是非常的困难和复杂的。Android提供了getQuantityString()来帮助我们决定选择适当的资源。
语法:
[html] view plain copy
  1. <?xmlversion="1.0"encoding="utf-8"?>
  2. <resources>
  3. <plurals
  4. name="plural_name">
  5. <item
  6. quantity=["zero"|"one"|"two"|"few"|"many"|"other"]
  7. >text_string</item>
  8. </plurals>
  9. </resources>
文件位置:res/values/plural.xml
如何引用:R.plurals.plural_name
4、已编译和未编译的Android资源
Android主要通过两种文件类型支持资源:XML文件和原始文件(包括图像和音频,视频);其中xml文件,有的会编译为二进制文件,另一种按原样复制到设备。可以将XML文件放到/res/xml/子目录中,以将它们编译为二进制格式,可以使用Android提供的XML阅读器读取xml节点。但如果将文件(包括xml)放到了/res/raw/目录下,他们将不会编译为二进制,必须使用明确的基于流式传输的API来读取这些文件。
下面是/res文件夹中一些重要的子目录和他们保存的资源类型。
anim:已编译的动画文件
drawable:位图
layout:UI/视图文件
values:数组、颜色、尺寸、字符串和样式
xml:已编译的任意xml文件
raw:未编译的原始文件
5、使用字符串数组
[html] view plain copy
  1. <?xmlversion="1.0"encoding="utf-8"?>
  2. <resources>
  3. <stringname="hello">HelloWorld,String_Resource!</string>
  4. <stringname="app_name">String_Resource</string>
  5. <string-arrayname="test_array">
  6. <item></item>
  7. <item></item>
  8. <item></item>
  9. </string-array>
  10. </resources>

拥有此字符串数组资源定义后,可以利用Java代码获取次数组,代码如下:

[java] view plain copy
  1. publicclassString_ResourceextendsActivity{
  2. privatestaticfinalStringTAG="stringarray";
  3. @Override
  4. publicvoidonCreate(BundlesavedInstanceState){
  5. super.onCreate(savedInstanceState);
  6. setContentView(R.layout.main);
  7. //得到字符串资源数组
  8. Resourcesr=getResources();
  9. String[]strings=r.getStringArray(R.array.test_array);
  10. //通过日志打印数组内容
  11. for(Stringstr:strings){
  12. Log.i(TAG,str);
  13. }
  14. }
  15. }

6、资源plurals表示数量的各种方式,比如:一个教室有多少学生。考虑下面的例子:
there is 1 student;
there are 2 students;
there are 50 students;
显然对于2,50句子格式是一样的,对于1不同,Android支持将这种变体表示为plurals资源。
[html] view plain copy
  1. <?xmlversion="1.0"encoding="utf-8"?>
  2. <resources>
  3. <stringname="hello">HelloWorld,Resource_Plurals!</string>
  4. <stringname="app_name">Resource_Plurals</string>
  5. <pluralsname="student">
  6. <itemquantity="one">Thereis1student</item>
  7. <itemquantity="other">Thereare%dstudents</item>
  8. </plurals>
  9. </resources>
在Java代码中获取定义的plurals资源
[java] view plain copy
  1. publicclassResource_PluralsextendsActivity{
  2. /**Calledwhentheactivityisfirstcreated.*/
  3. @Override
  4. publicvoidonCreate(BundlesavedInstanceState){
  5. super.onCreate(savedInstanceState);
  6. setContentView(R.layout.main);
  7. Resourcesr=getResources();
  8. Strings1=r.getQuantityString(R.plurals.student,1,1);
  9. Log.i("plurals",s1);
  10. Strings2=r.getQuantityString(R.plurals.student,2,2);
  11. Log.i("plurals",s2);
  12. Strings3=r.getQuantityString(R.plurals.student,50,50);
  13. Log.i("plurals",s3);
  14. }
  15. }
7、尺寸资源
px:像素
in:英寸
mm:毫米
pt:磅
dp:与密度无关的像素
sp:与比例无关的像素
8、色图资源
Android支持一种称为“色图”的图形对象资源,实际上是一个彩色的矩形;
定义色图资源的xml语法:
res/values/colordrawable.xml
[html] view plain copy
  1. <?xmlversion="1.0"encoding="utf-8"?>
  2. <resources>
  3. <drawablename="red_rectangle">#f00</drawable>
  4. <drawablename="blue_rectangle">#0000ff</drawable>
  5. <drawablename="green_rectangle">#f0f0</drawable>
  6. </resources>
在Java代码中使用色图资源
[java] view plain copy
  1. publicclassResource_ColorDrawableextendsActivity{
  2. privateTextViewtext1;
  3. /**Calledwhentheactivityisfirstcreated.*/
  4. @Override
  5. publicvoidonCreate(BundlesavedInstanceState){
  6. super.onCreate(savedInstanceState);
  7. setContentView(R.layout.main);
  8. text1=(TextView)findViewById(R.id.text1);
  9. ColorDrawablecd=(ColorDrawable)getResources().getDrawable(R.drawable.red_rectangle);
  10. text1.setBackgroundDrawable(cd);
  11. }
  12. }
在XML文件中使用色图资源
[html] view plain copy
  1. <TextView
  2. android:id="@+id/text2"
  3. android:layout_width="fill_parent"
  4. android:layout_height="wrap_content"
  5. android:text="@string/hello"
  6. android:background="@drawable/blue_rectangle"
  7. />
9、使用任意XML资源文件
Android允许将任意的xml文件用作资源。放在/res/xml/子目录下,如:
[html] view plain copy
  1. <rootitem>
  2. <subitem>
  3. HelloWorld!
  4. </subitem>
  5. </rootitem>
使用XmlPullParser解析xml文件,读取内容:
[java] view plain copy
  1. publicclassResource_XMLextendsActivity{
  2. /**Calledwhentheactivityisfirstcreated.*/
  3. @Override
  4. publicvoidonCreate(BundlesavedInstanceState){
  5. super.onCreate(savedInstanceState);
  6. setContentView(R.layout.main);
  7. Log.i("xml",getEventsFromAnXmlFile(Resource_XML.this));
  8. }
  9. //使用XmlPullParser解析xml文件
  10. privateStringgetEventsFromAnXmlFile(Activityactivity){
  11. StringBuffersb=newStringBuffer();
  12. //获得资源对象
  13. Resourcesr=activity.getResources();
  14. //获得解析器
  15. XmlResourceParserparser=r.getXml(R.xml.test);
  16. try{
  17. parser.next();
  18. inteventType=parser.getEventType();
  19. //循环,直到文档结尾
  20. while(eventType!=XmlResourceParser.END_DOCUMENT){
  21. if(eventType==XmlResourceParser.START_DOCUMENT){
  22. sb.append("**********文档开始");
  23. }elseif(eventType==XmlResourceParser.START_TAG){
  24. sb.append("\n标签开始"+parser.getName());
  25. }elseif(eventType==XmlResourceParser.END_TAG){
  26. sb.append("\n标签结束"+parser.getName());
  27. }elseif(eventType==XmlResourceParser.TEXT){
  28. sb.append("\n文本"+parser.getText());
  29. }
  30. eventType=parser.next();
  31. }
  32. }catch(XmlPullParserExceptione){
  33. e.printStackTrace();
  34. }catch(IOExceptione){
  35. e.printStackTrace();
  36. }
  37. sb.append("\n**********文档结束");
  38. returnsb.toString();
  39. }
  40. }

日志结果如下:

[html] view plain copy
  1. 04-2612:30:40.923:INFO/xml(519):**********文档开始
  2. 04-2612:30:40.923:INFO/xml(519):标签开始rootitem
  3. 04-2612:30:40.923:INFO/xml(519):标签开始subitem
  4. 04-2612:30:40.923:INFO/xml(519):文本HelloWorld!
  5. 04-2612:30:40.923:INFO/xml(519):标签结束subitem
  6. 04-2612:30:40.923:INFO/xml(519):标签结束rootitem
  7. 04-2612:30:40.923:INFO/xml(519):**********文档结束
10、使用原始资源
除了任意xml文件外Android还支持使用原始文件。这些原始资源放在/res/raw目录下,包括音频,视频或文本文件等。与/res/xml文件不同,次目录下的文件没有编译,而是按原样转移到应用程序包中。下面是个例子:
在/res/raw/目录下建一文本文件test.txt,内容为:HelloWorld,使用原始资源!
下面代码读取此原始文件的内容:
[java] view plain copy
  1. publicclassResource_Res_TxtextendsActivity{
  2. /**Calledwhentheactivityisfirstcreated.*/
  3. @Override
  4. publicvoidonCreate(BundlesavedInstanceState){
  5. super.onCreate(savedInstanceState);
  6. setContentView(R.layout.main);
  7. Stringtext=getStringFromRawFile(Resource_Res_Txt.this);
  8. Log.i("Txt",text);
  9. }
  10. //读取文件内容
  11. privateStringgetStringFromRawFile(Activitya){
  12. StringBuffersb=newStringBuffer();
  13. Resourcesr=a.getResources();
  14. StringmyText=null;
  15. InputStreamis=r.openRawResource(R.raw.test);
  16. try{
  17. myText=convertStreamToString(is);
  18. is.close();
  19. }catch(IOExceptione){
  20. //TODOAuto-generatedcatchblock
  21. e.printStackTrace();
  22. }
  23. returnmyText==null?"":myText;
  24. }
  25. privateStringconvertStreamToString(InputStreamis)throwsIOException{
  26. ByteArrayOutputStreambaos=newByteArrayOutputStream();
  27. inti=is.read();
  28. while(i!=-1){
  29. baos.write(i);
  30. i=is.read();
  31. }
  32. returnbaos.toString();
  33. }
  34. }
打印日志为:
[html] view plain copy
  1. 04-2612:51:45.923:INFO/Txt(553):HelloWorld,使用原始资源!
11、使用资产
Android提供了一个/assets目录,它中的文件不会在R.java中生成资源id,必须指定文件路径才能读取他们,文件路径是以/asserts开头的相对路径。可以使用AssertManage类读取该目录下文件。代码如下:
[java] view plain copy
  1. privateStringgetStringFromAssetsFile(Activitya){
  2. StringBuffersb=newStringBuffer();
  3. AssetManageram=a.getAssets();
  4. StringmyText=null;
  5. InputStreamis=am.open("test.txt");
  6. try{
  7. myText=convertStreamToString(is);
  8. is.close();
  9. }catch(IOExceptione){
  10. //TODOAuto-generatedcatchblock
  11. e.printStackTrace();
  12. }
  13. returnmyText==null?"":myText;
  14. }
12、资源的配置和更改

资源有助于本地化。Android支持资源基于用户语言环境而改变,也支持随设备垂直或水平位置改变而改变。如:

[html] view plain copy
  1. \res\layout\main_layout.xml
  2. \res\layout-port\main_layout.xml
  3. \res\layout-land\main_layout.xml

尽管有3个布局文件,但它们在R.java中只生成以布局Id。目录扩展-port和-land称为配置修饰符,它区分大小写。使用连字符-与目录名称隔开。配置修饰副指定的资源称为备用资源,没有配置修饰副修饰的资源称为默认资源。
其他备用资源目录,如下:
mccAAA:AAA移动设备国家代码
mncAAA:AAA运营商/网络代码
en-rUS:语言区域
small,normal,large,xlarge:屏幕大小
long,notlong:屏幕类型
port,land:纵向/横向
night,tonight:晚上/白天
notouch,stylus,finger:屏幕种类
V3,V4,V7:API

更多相关文章

  1. android-xml布局属性 - 随心
  2. Android常用布局
  3. android项目中每个文件的作用
  4. Fast File Transfer – 让 Android 通过 WIFI 传输文件到任何无
  5. android中资源整理
  6. Android开发5——文件读写
  7. Android之四大布局
  8. Android布局文件属性笔记

随机推荐

  1. Android中StateListDrawable的种类(状态的
  2. 【安卓开发】Facebook工程师是如何改进他
  3. Android盈利模式,哪种更靠谱?
  4. 在Android设备上运行纯java代码
  5. Google Android内核编译教程
  6. android 在android中教你一行代码判断是
  7. ANDROID深入研究和学习的课程
  8. 如何保证Android设备的安全性
  9. [Android]基本概念
  10. Android软键盘-弹起时布局向上拉-多表单