现在的位置: 首页 > 综合 > 正文

Android 资源管理

2017年11月14日 ⁄ 综合 ⁄ 共 5010字 ⁄ 字号 评论关闭

一、资源介绍

Android应用程序主要由两部分内容组成:代码和资源。资源主要就是指那些与UI相关的东西,例如UI布局、字符串和图片等。代码和资源分开可以使得应用程序在运行时根据实际需要来组织UI。这样就可使得应用程序只需要编译一次,就可以支持不同的UI布局。这种特性使得应用程序在运行时可以适应不同的屏幕大小和密度,以及不同的国家和语言等。在本文中,我们就简要介绍Android的资源管理框架,以及制定学习计划。

        在软件开发中,说到代码与资源分离,最容易想到的可能就是Web开发了。在Web开发中,我们一般会通过CSS文件来描述HTML页面的展现形式,也就是通过CSS来控制HTML页面的UI。这样就可以很方便地进行Web开发和维护。例如,当我们要更改HTML页面的UI时,只要修改相应的CSS文件就可以了。注意,这些CSS文件都是在运行时加载的。这样我们就可以根据HTML页面的运行环境来加载不同的CSS文件,例如,根据不同的地区或者语言来选择不同的CSS文件,从而实现国际化。

        再来看PC客户端软件的开发。开始的时候,微软的MFC应用程序框架非常流行。在开发MFC程序的时候,代码和资源同样也是分开的,例如,程序的界面一般都是通过一个RC文件来描述的。不过我们一般都是在Visual Studio里面通过可视化界面来编辑RC文件的,即一般都不会直接手动去操作RC文件,所以我们一般都不怎么意识到其实RC文件和CSS文件一样,都是用来描述程序的界面的。实际上,RC文件和CSS文件一样,都是可以看作是一个界面配置文件,而且它们的配置信息都是通过文字来描述的,只不过这些文字描述要遵循一定的规范。

        随着PC客户端软件的发展,微软的MFC应用程序框架显得有些力不从心了,其中的一个原因就是它的界面比较丑陋。如果要对MFC应用程序的UI进行美化以及个性化的话,是要费比较大的劲的,这严重地影响了软件开发效率,特别是不适合要进行快速迭代开发的互联网客户端软件。微软后来又开发了另外一套应用程序开发框架WPF。WPF同样是使用一种称为XAML的文件来描述应用程序的界面的。实际上,包括现在Win 8的Metro界面,也同样是通过XAML文件来描述应用程序界面的。XAML文件是一种XML文件,它具有更好的可读性,非常方便编辑以及维护。

        在PC客户端软件的发展过程中,还有一种不得不提的应用程序框架——QT。QT最初由Trolltech公司开发,后来被Nokia收购。随着Meego的没落,如日冲天的Nokia也没落了,Qt又被卖给了芬兰的另外一家IT服务公司Digia。QT也算得是一套优秀的应用程序框架,而且它是跨平台的。QT同样也是通过一种称为QML的文件来描述应用程序的界面的,不过QML文件不是XML格式的,它的格式有点类似Web页面的CSS。

        类似这种采用XML文件来描述界面的PC客户端软件开发框架其实还有很多,例如,迅雷用的Bolt界面引擎,以及腾讯QQ用的GF界面引擎,它们都同样是通过XML文件来描述程序界面的,并且做成代码和界面描述文件分离。

        最后看iOS应用程序的开发,它的界面和代码同样是分开,并且通过一种称为XIB的文件来描述界面。XIB文件实际上也是一个XML文件,因此,它也是非常方便编辑以及维护的。

        从上面的分析就可以看出,无论是Web应用程序,还是PC客户端应用程序,以及移动客户端应用程序,它们都无一例外地将代码与界面分离,并且界面都是通过描述性的文字来描述的,这种描述性的文字越来越倾向于使用XML格式。

        Android应用程序作为一种移动客户端应用程序,它同样也是毫无意外地将代码逻辑和界面资源进行分离,但是它的资源管理方式与传统的Web应用程序和PC客户端应用程序以及iOS应用程序相比会更复杂一些,这是因为Android应用程序可能会运行在各种大小和密度不等的设备之上。接下来我们就将注意力集中在Android应用程序资源的组织和管理之上。

        我们首先看Android应用程序资源的分类。Android应用程序资源可以分为两大类,分别是assets和res:

        1. assets。assets类资源放在工程根目录的assets子目录下,它里面保存的是一些原始的文件,可以以任何方式来进行组织。这些文件最终会被原装不动地打包在apk文件中。如果我们要在程序中访问这些文件,那么就需要指定文件名来访问。例如,假设在assets目录下有一个名称为filename的文件,那么就可以使用以下代码来访问它:

[java] view
plain
copy在CODE上查看代码片派生到我的代码片

  1. AssetManager am= getAssets();    
  2. InputStream is = assset.open("filename");  

 
      
2.
res
。res类资源放在工程根目录的res子目录下,它里面保存的文件大多数都会被编译,并且都会被赋予资源ID。这样我们就可以在程序中通过ID来访问res类的资源。res类资源按照不同的用途可以进一步划分为以下9种子类型:

        --animator。这类资源以XML文件保存在res/animator目录下,用来描述属性动画。属性动画通过改变对象的属性来实现动画效果,例如,通过不断地修改对象的坐标值来实现对象移动动画,又如,通过不断地修改对象的Alpha通道值来实现对象的渐变效果。

        --anim。这类资源以XML文件保存在res/anim目录下,用来描述补间动画。补间动画和属性动画不同,它不是通过修改对象的属性来实现,而是在对象的原来形状或者位置的基础上实现一个变换来得到的,例如,对对象施加一个旋转变换,就可以获得一个旋转动画,又如,对对象实施一个缩放变换,就可以获得一个缩放动画。从数学上来讲,就是在对象的原来形状或者位置的基础上施加一个变换矩阵来实现动画效果。注意,在动画的执行过程中,对象的属性是始终保持不变的,我们看到的只不过是它的一个变形副本。

        --color。这类资源以XML文件保存在res/color目录下,用描述对象颜色状态选择子。例如,我们可以定义一个选择子,规定一个对象在不同状态下显示不同的颜色。对象的状态可以划分为pressed、focused、selected、checkable、checked、enabled和window_focused等7种。

        --drawable。这类资源以XML或者Bitmap文件保存在res/drawable目录下,用来描述可绘制对象。例如,我们可以在里面放置一些图片(.png, .9.png, .jpg, .gif),来作为程序界面视图的背景图。注意,保存在这个目录中的Bitmap文件在打包的过程中,可能会被优化的。例如,一个不需要多于256色的真彩色PNG文件可能会被转换成一个只有8位调色板的PNG面板,这样就可以无损地压缩图片,以减少图片所占用的内存资源。

        --layout。这类资源以XML文件保存在res/layout目录下,用来描述应用程序界面布局。

        --menu。这类资源以XML文件保存在res/menu目录下,用来描述应用程序菜单,例如,Options Menu、Context Menu和Sub Menu。

        --raw。这类资源以任意格式的文件保存在res/raw目录下,它们和assets类资源一样,都是原装不动地打包在apk文件中的,不过它们会被赋予资源ID,这样我们就可以在程序中通过ID来访问它们。例如,假设在res/raw目录下有一个名称为filename的文件,并且它在编译的过程,被赋予的资源ID为R.raw.filename,那么就可以使用以下代码来访问它:

[java] view
plain
copy在CODE上查看代码片派生到我的代码片

  1. Resources res = getResources();  
  2. InputStream is = res .openRawResource(R.raw.filename);  

 
      
--values。这类资源以XML文件保存在res/values目录下,用来描述一些简单值,例如,数组、颜色、尺寸、字符串和样式值等,一般来说,这六种不同的值分别保存在名称为arrays.xml、colors.xml、dimens.xml、strings.xml和styles.xml文件中。

        --xml。这类资源以XML文件保存在res/xml目录下,一般就是用来描述应用程序的配置信息。

        注意,上述9种类型的资源文件,除了raw类型资源,以及Bitmap文件的drawable类型资源之外,其它的资源文件均为文本格式的XML文件,它们在打包的过程中,会被编译成二进制格式的XML文件。这些二进制格式的XML文件分别有一个字符串资源池,用来保存文件中引用到的每一个字符串,包括XML元素标签、属性名称、属性值,以及其它的一切文本值所使用到的字符串。这样原来在文本格式的XML文件中的每一个放置字符串的地方在二进制格式的XML文件中都被替换成一个索引到字符串资源池的整数值。这样做有两个好处:

        A. 文件占用更小。例如,假设在原来的文本格式的XML文件中,有四个地方使用的都是同一个字符串,那么在最终编译出来的二进制格式的XML文件中,字符串资源池只有一份字符串值,而引用它的四个地方只占用一个整数值。

        B. 解析速度更快。由于在二进制格式的XML文件中,所有的XML元素标签和属性等值都是使用整数来描述的,因此,在解析的过程中,就不再需要进行字符串解析,这样就可以提高解析速度。

        还有另外一个地方需要注意的是,每一个res资源在编译的打包完成之后,都会被分配一个资源ID,这些资源ID被终会被定义为Java常量值,保存在一个R.java文件中,与应用程序的其它源文件一起被编译到程序中,这样我们就可以在程序或者资源文件中通过这些ID常量来访问指定的资源。

转自:http://blog.csdn.net/luoshengyang/article/details/8738877

二、资源命名

这些资源的名称最后都会被编译为Java的常量名称,例如String.xml中定义的hello被编译为Java常量Hello,因此资源的命名要符合Java变量命名规范。

由于ADT在生成ID时并不考虑资源文件的扩展名,所以,不能存在文件名相同,扩展名不同的资源文件。例如在res\drawable目录不能同时放置icon.jpg和icon.png。

同类的资源的文件名或变量名不能重复,因为同类资源的ID都被放在R的同一个内置类中,当然也就不允许有重名的类,同一个类中也不允许有重名的变量。

三、资源访问

语法格式:@[package:]type/name。package资源所在包名,默认与应用的源代码所在的包名同名。type为资源的类型,name为资源的名称。

布局文件中引用:android:text="@string/hello";android:textColor="@color/red"。

Java代码中引用:String
hello = getResources().getString(R.string.hello)
;Color red =
getResources().getCoor(R.color.red)

 
   四、字符串资源格式化详细介绍

<string name="today_state_string">您正与%1$d位朋友在一起游戏,本周排名提升了%2$.3f,获得%3$s的称号,等级为%4$c!</string>

格式:%+参数位置+$+格式化类型,其中:

参 数  位 置:从1开始依次编号,String.forma方法的第二个参数为格式化的第一个参数,后面依次递增;

格式化类型:s 字符串;f 浮点数;d 整型数;c 字符类型

使用:String
sAgeFormat1 = getResources().getString(R.string.
today_state_string);  
String
sFinal1 = String.format(12345,68.376f,"李四",'B');

抱歉!评论已关闭.