资源描述
2013年1月23日14:50:42
Android应用的源代码大致可分为如下三大类:
-》界面布局文件:XML文件,文件中每个标签都对应于相应的View标签
-》Java源文件:应用中的Activity、Service、BroadcaseReceiver、ContentProvider四大组件都是采用Java代码实现的。
-》资源文件:主要以各种XML为主,还可以包括*.png 、*.jpg 、*.gif图片资源
Android应用对字符串常量、数值常量的定义做了进一步的改进:android允许把应用中用到的各种资源:字符串资源、颜色资源、数组资源、菜单资源等都集中放到res目录中定义,应用程序则直接使用这些资源中的定义的值。
Android应用下除了res目录用于存放资源之外,assets目录也用于存放资源。一般来说,assets目录下存放的资源代表应用无法直接访问的原生资源,应用程序需要通过AssetMassager以二进制的形式来读取资源。而res目录下的资源,android SDK会在编译该应用时,自动在R.java文件中为这些资源创建索引,程序可直接通过R资源清单进行访问。
6.1资源的类型及存储方式
Android应用资源可分为两大类:
-》无法直接访问是原生资源,保存在asset目录下
-》可通过R资源清单访问的资源,保存在res目录下。
6.1.1资源的类型以及存储方式
Android要求在res目录下用不用的子目录来保存不同的应用资源。
Android不同资源再/res目录下的存储方式:
一旦将应用程序的各种资源分别保存在android应用的/res目录下,接下来既可以在Java程序中使用这些资源,也可以在其他XML资源中使用这些资源。
6.1.2使用资源
在android应用中使用资源科分为在Java代码和XML文件中使用资源,其中Java代码用于android应用定义四大组件,而XML文件中则用于为android应用定义各种资源。
1. 在Java代码中使用资源
由于android SDK会在编译应用时在R类中为/res目录下所有资源创建索引项,因此在Java代码中访问资源主要通过R类来完成。其完整的语法格式为:
[<package_name>.]R.<resource_type>.<resource_name>
上面语法格式成分的说明如下:
-》<package_name>.:指定R类所在包,实际上就是使用权限定类名。当然,如果再Java程序中导入R类所在包,就可以省略包名。
-》<resource_type>:R类中代表不同资源类型的子类,例如String代表字符串资源
-》<resource_name>:指定资源的名称。该资源名称可能是无后缀的文件名,也可能是XML资源元素中由android:name属性所指定的名称。
2. 在XML代码中使用资源
当定义XML资源文件时,其中的XML源可能需要不同的值,这些值就可以设置为已定义的资源项。在XML代码中使用资源完整语法格式:
@[<package_name>:]<resource_type>/<resource_name>
上面语法格式中个成分的说明:
-》<package_name>:指定资源所在应用指定包。如果所在引用的资源和当前资源位于同一包下,则可以省略
-》<resource_type>:R类中代表不同资源类型的子类。
-》<resource_name>:指定资源的名称。该资源名称可能是无后缀的文件名,也可能是XML资源元素中由android:name属性所指定的名称。
6.2使用字符串、颜色、尺寸资源
字符串资源、颜色资源、尺寸资源,它们对于的XML文件都将位于/res/values目录下,它们默认的文件名,以及在R类中对于的内部类如下:
6.2.1颜色值的定义
Android中的颜色是通过红(Red)、绿(Green)、蓝(Blue)三原色,以及一个透明度(Alpha)值来表示的,颜色值总是以井号(#)开头,接下来就是Alpha-Red-Green-Blue的形式。其中Alpha值可以省略,如果省略了Alpha值,那么该颜色默认是完全不透明的。
Android颜色值支持常见的四种形式:
-》#RGB:分别制定红、绿、蓝三原色的值(只支持0~f这16级颜色)来代表颜色
-》#ARGB:分别制定红、绿、蓝三原色的值(只支持0~f这16级颜色)及透明度(只支持0~f这16级透明度)来代表颜色
-》RRGGBB:分别制定红、绿、蓝三原色的值(只支持00~ff这256级颜色)来代表颜色
-》AARRGGBB:分别制定红、绿、蓝三原色的值(只支持00~ff这256级颜色)及透明度(只支持00~ff这16级透明度)来代表颜色
6.2.2定义字符串、颜色、尺寸资源文件
字符串资源文件位于res/values目录下,字符串资源文件的跟元素是<resource....>,该元素里每个<string.../>子元素定义一个字符串常量,其中<string...../>元素的name属性指定该常量的名称,<string.../>元素开始标签和结束标签之间的内容代表字符串值。
<string name=”hello”>Hello World,ValuesResTest</string>
<resources>
<string name="app_name">6.2.1</string>
<string name="hello_world">Hello world!</string>
<string name="menu_settings">Settings</string>
<string name="title_activity_test6_2_1">Test6_2_1</string>
<string name="c1">F00</string>
<string name="c2">0F0</string>
<string name="c3">00F</string>
<string name="c4">0FF</string>
<string name="c5">F0F</string>
<string name="c6">Ff0</string>
<string name="c7">07F</string>
<string name="c8">70F</string>
<string name="c9">F70</string>
</resources>
颜色资源文件位于res/vaues目录下,颜色资源文件的根元素<resurce...>
<?xml version="1.0" encoding="utf-8"?>
<resources>
<color name="c1">#F00</color>
<color name="c2">#0F0</color>
<color name="c3">#00F</color>
<color name="c4">#0FF</color>
<color name="c5">#F0F</color>
<color name="c6">#FF0</color>
<color name="c7">#07F</color>
<color name="c8">#70F</color>
<color name="c9">#F70</color>
</resources>
尺寸资源文件位于res/values目录下,尺寸资源文件的根元素是<resource...>
<?xml version="1.0" encoding="utf-8"?>
<resources>
<dimen name="spacing">8dp</dimen>
<dimen name="cell_width">60dp</dimen>
<dimen name="cell_height">66dp</dimen>
<dimen name="title_font_size">18sp</dimen>
</resources>
6.2.3使用字符串、颜色、尺寸资源
实例:6.2.1
Android也允许使用资源文件来定义boolean常量,例如在/res/values目录下增加一个booleans.xml文件,该文件的根元素也是<resource.../>
<?xml version="1.0" encoding="utf-8"?>
<resources>
<bool name="is_male">true</bool>
<bool name="is_big">false</bool>
</resources>
6.3数组(Array)资源
Android同样采用位于/res/values目录下的array.xml文件来定义数组,定义数组时XML资源文件的根元素也是<resource..../>元素,该元素内可包含三种子元素:
-》<array.../>子元素:定义普通类型的数组。例如Drawable数组。
-》<string-array.../>子元素:定义字符串数组。
-》<integer-array.../>子元素:定义整数数组。
6.4使用(Drawable)资源
Drawable资源是android应用中使用最广泛的资源,也是android应用中最灵活的资源,它不仅可以直接使用*.png 、*.jpg 、*.gif图片作为资源,也可以使用多种XML文件作为资源。只要一份XML文件可以被系统编译成Drawable子类的对象,那这份XML文件即可作为Drawable资源。
Drawable资源通常保存在/res/drawable目录下。
6.4.1图片资源
图片资源是最简单的Drawable资源,只要把图片放入/res/drawable-xxx目录下,android SDK就会在编译应用自动加载该图片,并在R资源清单类中生成资源的索引。
注意:android不允许图片资源的文件名出现大写字母,且不能以数字开头。否则android SDK无法为该图片在R类中生成资源索引
6.4.2StateListDrawable资源
2StateListDrawable用于组织多个Drawable对象。当使用StateListDrawable作为目标组件的背景、前景图片时,,StateListDrawable对象所显示的Drawable对象会随目标组件状态的改变而自动切换。
定义2StateListDrawable对象是XML文件的根元素为你<selector.../>,该元素可以包含多个<iten.../>元素,该元素可指定如下属性。
-》android:color或android:drawable:指定颜色或Drawable对象
-》android:state_xxx:指定一个特定状态。
StateListDrawable的<item.../>元素所支持的状态有如下;
实例:高亮显示正在输入的文本框(6.4.1)不正常的
6.4.3LayerDrawable资源
与StateListDrawable有点类似,LayerDrawable也可包含一个Drawable数组,因此系统将会按这些Drawable对象的数组顺序来绘制它们,索引最大的Drawable对象将会绘制在最上面。
定义LayerDrawable对象的XmL文件的根元素为<layer-list.../>,该元素可以包含多个<item.../>元素,该元素可指定如下属性:
-》android:drawable:指定作为LayerDrawable元素之一的Drawable对象
-》android:id:为该Drawable对象指定一个标识。
-》android:button|top|left|button:它们用于指定一个长度值,用于指定该Drawable对象绘制到目标组件的指定位置。
实例:定制滚动条的外观(6.4.2)不正常
部分跳过
6.5使用原始XML资源
在某些时候,android用于有一些初始化的配置信息、用于相关的数据资源需要保存,一般使用XML文件来保存他们,这种资源就是原始XML资源。
6.5.1定义原始XML资源
原始XMl资源一般保存在/res/xml路径下——当使用创建android用于时。/res目录下并没有包含xml目录,开发者应该自行动手创建xml目录。
接下来android用于对原始XML资源诶有任何特殊的要求,只要他是一份格式良好的XML文档即可。
一旦成功地定义了原始XML资源,接下来在XML文件中可通过如下语法来访问它:
-》@[<package_name>]xml.file_name
在Java代码中则按如下语法格式来访问它:
-》[<package>.R.xml.<file-name>]
为了在Java程序中获取实际的XmL文档,可以通过如下Resource的两个方法来获取:
-》XmlResourceParser getXml(int id):获取XML文档,并使用一个XmlPullParser来解析XML文档,该方法返回一个解析器的对象(XmlResourceParser是XmlPullParser的子类)
-》InputStream openRawResource(int id):获取XML文档对应的输入流。
6.5.2使用原始XML文件
实例:6.5.1
6.6使用布局(Layout)资源
Layout资源放在/res/layout目录下,Layout资源文件的根元素通常是各种布局管理器,比如LinearLayout、TableLayout、FrameLayout等,接着在该布局管理器中定义各种View组件即可。
6.7使用菜单(Menu)资源
使用XML定义菜单将会提供更好的解耦
6.7.1定义菜单资源
菜单资源文件通常应该放在/res/menu目录下,菜单资源的根元素通常是<menu.../>元素,<menu.../>元素无需指定任何属性。<menu.../>元素内可包含如下子元素:
-》<item../>元素:定义菜单项。
-》<group.../>子元素:将多个<item../>定义的菜单包装成一个菜单项
<group.../>子元素用于控制整组菜单的行为,该元素可指定如下常用属性。
-》checkableBehavior:指定该组菜单的选择行为。可指定为none、all和single三个值。
-》menuCategory:对菜单进行分类,指定菜单的优先级。有效值为container
System、secondary和alternative。
-》visible:指定该组菜单是否可见。
-》enable:指定该组菜单是否可用。
<item../>元素用于定义一份菜单项,<item../>元素又可以包含<menu../>元素,位于<item../>元素内部的<menu./>就代表子菜单。
<item../>元素可指定为如下常用属性:
-》android:id:为菜单项指定一个唯一标识。
-》android:title:指定菜单项的标题。
-》android:icon:指定菜单项的图标。
-》android:alphabeticShortcut:为菜单项指定字符快捷键。
-》android:numbericShortcut:为菜单项指定数字快捷键。
-》android:checkable:设置该菜单项是否可选。
-》android:chcked:设置该菜单项是否已选中。
-》android:visible:设置该菜单项是否可见。
-》android:enable:设置该菜单项是否可用。
一旦在程序中定义了菜单资源后,接下来还是重写onCreateOptionsMenu(用于创建选项菜单)、onCreateContextMenu(用于创建上下文菜单)方法,在这些方法调用MenuInFlater对象的inflater方法装载指定资源对应的菜单即可
6.7.2使用菜单资源
实例:(6.7.1)
6.8样式(Style)和主题(Theme)资源
样式和主题资源都是用于对android应用进行美化的,只是充分利用android应用的样式和主题资源,开发者可以开发出各种风格的android应用。
6.8.1样式资源
Android的样式资源文件也放在/res/values目录下,样式资源文件的根元素是<resource../>元素,该元素内可包含多个<style.../>子元素,每个<style.../>元素定义一个样式。
<.style.../>元素指定如下两个属性。
-》name:指定样式的名称。
-》parent:指定该样式所继承的父样式。当继承某个父样式时,该样式会获得赴样式中定义的全部样式。当然,当前样式也可以覆盖赴样式中指定的格式。
<.style.../>元素内可以包含多个<item../.>子元素,每个<item../.>子元素定义一个格式项。
实例:6.8.1
6.8.2主题资源
与样式资源非常相似,主题资源的XML文件通常也放在/res/values目录下,主题资源的XML文档同样以<resource.../>元素作为根元素,同样使用<style../>元素来定义主题。
主题与样式的区别在于:
-》主题不能作用于单个View组件,主题应该对整个应用中的所以Activity起作用,或对指定的Activity起作用。
-》主题定义的格式应该是改变窗口外观的格式,例如窗口的标题
窗口边框等。
实例:给所有窗口添加边框、背景(6.8.2) 不正常
大部分时候,在AndroidManifest.xml文件中最指定应用、指定Activity应用主题更加简洁。如果想让应用中全部窗口使用该主题,只要为<application.../>元素添加android:theme属性。属性值是一个主题的名字。
6.9属性(Attribute)资源
当在XML布局文件中使用android系统提供的View组件时,开发者可以指定多个属性,这些属性可以很好滴控制View组件的外观行为。如果用户开发的自定义View组件也需要指定属性,就需要属性资源的帮助了。
属性资源文件也放在/res/values目录下,属性资源文件的根元素也是<.resource..../>该元素里包含如下两个子元素。
-》attr子元素:定义一个属性。
-》declare-styleable子元素:定义一个styleable对象,每个styleable对象就是一组attr属性的集合。
实例:(6.9.1)不正常
6.10使用原始资源
除了上面介绍的各种XML文件、图片文件之外,android应用可能还需要用到大量其他类型的资源,比如声音资源等。实际上。声音对于android应用非常重要,选择合适的音效可以让android应用增色不少。
类似声音文件及其他各种类型的文件,只要android没有为之提供专门的支持,这种资源都被称为原始资源。Android的元素资源可以放在如下两个地方。
-》位于/res/raw目录下,android SDK会处理该目录下原始资源,android SDK会在R清单类中为该目录下资生成一个索引项。
-》位于/rassets/目录下,该目录下的资源是更彻底的原始资源。Android应用需要通过AssetManager来管理该目录下的原始资源。
AssetManager是一个专门管理/assets/目录下原始资源的管理器类,AssetManager提供了如下两个常用方法来访问Assets资源。
-》InputStream open(String fileName):根据文件名获取原始资源对应的输入流。
-》AssetFileDescriptor openFd(String fileName):根据文件名来获取原始资源对应的AssetFileDescriptor。AssetFileDescriptor代表了一项原始资源的描述,应用程序可通过AssetFileDescriptor来获取原始资源。
实例:6.10.1
2013年1月24日10:35:06
6.11国际化和资源自适应
6.11.1Java国际化的思路
Java程序的国际化的思路是将程序中标签、提示等信息放在资源文件中,程序需要支持哪个国家、语言环境,就需要提供相应的资源文件。资源文件时key-value对,每个资源文件中的key是不变的,但value则随着不同国家、语言改变。
Java程序的国家化主要通过如下三个雷完成:
-》java.util.ResourceBundle:用于加载一个国家、语言资源包
-》java.util.Locale:用于封装一个特定的国家、区域、语言环境
-》java.text.MessageFormat:用于格式化带占位符的字符串
为了实现程序的国际化,必须先提供程序所需要的资源文件。资源文件的内容适合很多key-value对。其中key是程序使用的部分,而value则是程序界面的显示字符串。
资源文件的命名可以有如下三种形式:
-》baseName_language_country.properties
-》baseName_language.properties
-》baseName.properties
其中baseName 是资源文件的基本名,用户可以自由定义。而language 和country都不可以随意变化,必须是Java所支持的语言和国家。
6.11.2Java支持的语言和国家
事实上,Java不可能支持所有的国家和语言,如需要获取Java所支持的语言和国家,可调用Locale类的getAvailableLocale方法获取,该方法返回一个Locale数组,该数组里包含了Java所支持的语言和国家。
实例:获取Java所有的国家和语言 (6.11.1)
6.11.4为android应用提供国际化资源
Android程序的国际化资源更加方便——因为android本身就采用lXML资源文件来来管理所有字符串消息,只要为各消息提供不同语言、国家对应的内容即可。
Android应用使用/res/values目录下的资源文件来保存程序中用到的字符串消息,为了给这些消息提供不同语言、国家的版本,开发者需要为values目录添加几个不同的语言版本,不同values文件的命名方式:
Values-语言代码-r国家代码
例如希望下面的应用支持简体中文、美式英语两种环境,则需要再res目录下添加values-zh-rCN、values-en-rUS两个目录。
不同语言的国家化资源文件中所有消息的key是相同的,不同语言、国家环境下,消息资源key对应的value不同。
6.11.5国家化android应用
Android的设计本身就是国家化的,当开发者在XML界面布局文件中、在Java代码中加载字符串资源时,android的国家化机制已经起作用了。
实例:6.11.2
展开阅读全文