6.1 资源的类型及存储方式:
Android应用资源可分为两大类:
(1)、无法直接访问的原生资源,保存在assets目录下,应用程序需要通过AssetManager以二进制的形式来读取资源;
(2)、可通过R资源清单类访问的资源,保存在res目录下,在编译应用的时候,会自动在R.java文件中为这些资源创建索引。
6.1.1 资源的类型以及存储方式:
如下:/res/anim/ 存放动画的XML文件;
/res/color/ 存放定义不同状态下颜色列表的XML文件;
/res/drawable/ 存放各种位图文件(如*.png、*.9.png、*.jpg、*.gif),除此之外还有各种Drawable对象的XML文件(包括BitmapDrawable、AnimationDrawable等其他各种子类的对象)( 注:*.9.png是一种非失真性压缩位图图形文件格式。1、允许开发人员定义可扩展区域,当需要延伸图片以填充比图片本身更大区域时,可扩展区的内容被延展。2、允许开发人员定义内容显示区,用于显示文字或其他内容);
/res/layout/ 存放各种用户界面的布局文件;
/res/menu/ 存放为应用程序定义各种菜单的资源,包括选项菜单、子菜单、上下文菜单资源等;
/res/raw/ 存放任意类型的原生资源,在java代码中可通过Resources对象的openRawResource(int id)方法来获取该资源的二进制输入流;
注:如果应用程序需要使用原生资源,推荐把这些原生资源保存到/assets目录下,然后在应用中使用AssetsManager来访问这些资源;
/res/values/ 存放各种简单值的XML文件,这些简单值包括字符串值、整数值、颜色值、数组等(建议的资源文件的命名:arrays.xml,colors.xml,dimens.xml,strings.xml,styles.xml等);
(提示:系统提供了drawable-ldpi(低分辨率)、drawable-mdpi(中等分辨率)、drawable-hdpi(高分辨率)三个子目录,这三个子目录的作用就相当于drawable子目录。大部分程序,系统会选择drawable-mdpi目录下的图片文件,如果系统使用高分屏,那么系统将会选择drawable-hdpi目录下的图片文件)。
6.1.2 使用资源
1、在java代码中使用资源
[<package_name>.]R.<resource_type>.<resource_name>
<package_name>:指定R类所在包,实际上就是使用全限定类名;
<resource_type>:R类中代表不同资源类型的子类;
<resource_name>:指定资源的名称。
2、在Xml代码中使用资源
@[<package_name>:]R.<resource_type>/<resource_name>
6.2 使用字符串、颜色、尺寸资源
Android颜色值支持常见的四种形式:#RGB、#ARGB、#RRGGBB、#AARRGGBB
与定义字符串资源类似的是,Android也允许使用资源文件来定义boolean常量(也可以是整形常量),可在/res/values目录下增加一个boolean.xml文件(文件名自由选择)。
如下:...........
<resources>
<boolean name="is_male">true</bool>
</resources>
6.3数组(Array)资源
数组元素包含三种子元素,如下:
1、<array.../>子元素:定义普通类型的数组(如:Drawable数组);
2、<string-array.../>子元素:定义字符串数组;
3、<integer-array.../>子元素:定义整形数组。
Resource提供如下方法:
1、intgertStringArray(int id):根据资源文件中字符串数组资源的名称来获取实际的字符串数组;
2、int getIntArray(intid):根据资源文件中整形数组资源的名称来获取实际的整形数组;
3、TypedArrayobtainTypedArray(int id):根据资源文件中普通数组资源的名称来获取实际的普通数组。
注意:TypedArray代表一个通用类型的数组,该;类提供了getXxx(int index)方法来获取指定的索引处的数组元素。
6.4 使用(Drawable)资源
注:Android不允许图片资源文件名中出现大写字母,且不能以数字开头。否则AndroidSDK 无法为该图片在R类中生成资源索引
6.4.2 StateListDrawable资源
StateListDrawable用于组织多个Drawable对象。当使用StateListDrawable作为目标组件的背景、前景图片时,StateListDrawable对象所显示的Drawable对象会随目标组件状态的改变而自动切换。
定义StateListDrawable对象的XML文件的根元素为<selector../>,该元素可以包含多个<item../>元素。它的属性有android:color指定颜色,android:drawable指定Drawable对象,android:state_xxx(其中有:checkable可勾选状态、checked已勾选状态、enabled可用状态、first开始状态、focused已得到焦点状态、last结束状态、middle中间状态、pressed已被按下状态、selected已被勾选状态、state_window_focused窗口已得到焦点状态):指定一个特定的状态。
6.4.3 LayerDrawable资源
与StateListDrawble类似,LayerDrawable包含一个Drawable数组,系统按这些Drawable对象的数组顺序绘制,索引最大的Drawable对象将被绘制在最上面。
定义LayerDrawable对象的XML文件的根元素为<layer-list.../>,该元素可以包含多个<item../>元素。它的元素有android:drawable指定作为LayerDrawable元素之一的Drawable对象,android:id为该Drawable对象指定一个标识。android:buttom|top|left|button用于指定将该Drawable对象绘制到目标组件的指定位置。
6.4.4 ShapeDrawable资源
ShapeDrawable用于定义一个基本的几何图形,定义ShapeDrawable的XML文件的根元素是<shape../>元素。它的元素有android:shape=["rectangle"| "oval"|"line"|"ring"];
6.4.5 ClipDrawable资源
ClipDrawable代表从其他位图上截取的一个"图片片段"。它的属性有android:drawable指定截取的源Drawable对象,android:clipOrientation指定截取方向,可设置水平截取或垂直截取,android;gravity指定截取时的对齐方式。另外使用ClipDrawable对象时可调用setLevel(int level)方法来设置截取的区域大小。setLevel()可实现图片徐徐展开的效果。
6.4.6 AnimationDrawable资源
Android既支持传统的逐帧动画(图片的切换),也支持通过平移、变换计算出来的补间动画。
定义补间动画的XML资源文件以<set.../>元素作为根元素。它的元素有alpha设置透明度的改变,scale设置图片进行缩放,translate设置图片进行位移变换,rotate设置图片进行旋转。
//加载动画资源
final Animation anim=AnimationUtils.loadAnimation(this,R,anim.my_anim);
//设置动画结束后保留结束状态
anim.setFillAfter(true);
//开始动画
image.startAnimation(anim);
6.5 使用原始XML资源
通过Resources的两个方法来获取Xml文件
1、XmlResourceParsegetXml(int id):获取XML文档,并使用一个XmlPullParser来解析XML文档,该方法返回一个解析器对象(XmlResourceParser是XmlPullParser的子类)。
2、InputStreamopenRawResource(int id):获取XML文档对应的输入流。
Android平台已经内置了Pull解析器,而且Android本身也使用Pull解析器来解析各种XML文档,因此Androi推荐开发者Pull解析器来解析XML文档。
6.5.2 使用原始XML文件
6.7 使用菜单(Menu)资源
6.7.1 定义菜单资源
菜单资源文件通常应该放在/res/menu目录下,菜单资源的根元素通常是<menu.../>元素,它包含的元素有item定义菜单项,group将多个定义的菜单包装成一个菜单组checkableBehavior:指定该组菜单的选择行为,menuCategory对菜单进行分类,指定菜单的优先级,visiable指定该组菜单是否可见,enable指定该组菜单是否可用。其中item元素用于定义一份菜单项,包含的元素有id、title、icon等。
@override
public boolean onCreateOptionsMenu(Menu menu){
MenuInflater inflater=newMenuInflater(this);
inflator.inflate(R.menu.my_menu,menu);
return super.omCreateOptionMenu(menu);
}
@override
public void onCreateContextMenu(ContextMenumenu,View source,ContextMenu.ContextMenuInfo menuInfo){
MenuInflater inflater=new MenuInflater(this);
inflater.inflate(R.menu.context,menu);
}
6.8 样式(Style)和主题(Theme)资源
6.8.1 样式资源
样式资源文件的根元素是<resources.../>元素,该元素内可包含多个<style.../>子元素,每个<style.../>元素定义一个样式。它包含的属性有name指定样式的名称,parent指定该样式所继承的父样式(当继承某个父样式时,该样式将会获得父样式中定义的全部格式,也可以覆盖父样式中指定的格式)。
6.8.2主题资源
主题与样式的区别主要体现在:
1、主题不能作用于单个的View组件,主题应该对整个应用中的所有Activity起作用,或对指定的Activity起作用。
2、主题定义的格式应该是改变窗口外观的格式,例如窗口标题、窗口边框等。
主题的设置有两种方法:
一个主题的名字是CrazyitTheme
1、在java代码里
setTheme(android.R.style.CrazyitTheme);
2、在AndroidManifest.xml文件中对指定应用、指定Activity应用主题更加简单
可在<application.../>或<activity.../>元素中添加android:theme="@style/CrazyTheme"
如果想要利用某个系统的主题,对它进行局部修改,则可通过继承系统主题来实现自定义主题
<style name="CrazyitTheme"parent="@android:style/Theme.Dialog">
6.9 属性(Attribute)资源
属性资源文件的根元素也是<resources.../>,该元素里包含两个元素,attr子元素,定义一个属性,declare-styleable子元素,定义一个styleable对象,每个styleable对象就是一组attr属性的集合。
6.10 使用原始资源
除了之前介绍的各种XML文件、图片文件之外,android应用可能还需要用到大量其他类型的资源,比如声音资源等。
AssetManager是一个专门管理/assets/目录下原始资源的管理类,AssetManager提供了如下两个常用方法来访问Assets资源。
1、InputStreamopen(String fileName):根据文件名来获取原始资源对应的输入流。
2、AssetFileDescriptoropen(String fileName):根据文件名来获取原始资源对应的AssetFileDescriptor。AssetFileDescriptor代表了一项原始资源的描述,应用程序可通过AssetFileDescriptor来获取原始资源。
6.11 国际化和资源自适应
java程序的国际化主要通过三个类完成:
1、java.util.ResourceBundle用于加载一个国家、语言资源包;
2、java.util.Locale 用于封装一个特定的国家/区域、语言环境;
3、java.text.MessageFormat用于格式化带占位符的字符串。
java不可能支持所有的国家和语言,如需要获取java所支持的语言和国家,可调用Locale类的getAvailableLocales方法获取,该方法返回一个Locale数组,该数组里包含了Java所支持的语言和国家。
例如:
1、res\values-en-rUS目录下的string.xml是美式英语的字符串资源文件;
2、res\values-zh-rCN目录下的string.xml是简体中文的字符串资源文件。
6.12 本章总结
首先本章主要介绍了Android应用资源的存储方式、Android应用资源的使用方式;Android应用的字符串资源、颜色资源、尺寸资源、数组资源、图片资源、各种Drawable资源、原始XML资源、布局资源、菜单资源、样式和主题资源、属性资源、原始资源等各种资源文件。
其次介绍了Android应用的国际化