您的位置:首页 > 移动开发 > Android开发

Android资源文件详解

2016-02-15 20:44 239 查看
之前在介绍项目目录结构时说到过Android程序的资源文件,Android软件是如何管理自己的资源文件的呢?

首先资源文件有那些类型,分为/res文件夹下预编译的和/assets原生的文件。

在res文件夹中会放些什么东西呢?

/anim文件夹放置XML文件的动画文件(它们会被编译成逐帧动画(frame by frame animation)或补间动画
(tweened animation) 对象),这个暂时还接触,不清楚。

/drawable文件夹下放置图片资源文件(png,jpg ,gif),可以通过Id获得对应资源图片Drawable对象。

类似的还有/raw文件夹下,放置了会直接复制到设备中的任意文件。它们无需编译,添加到你的应用程序编译产生的压缩文件中,可以通过getRawResource()方法获取。

/values文件夹下是可以被编译成很多种类型的资源的XML文件,保存着一些常量。

通过/values-xxx的后缀设置,可以进行不同国家语言本地化设置,比如简体中文放在/values-zh-rCN下

这个文件夹下的xml文件名可以自己设置,但有一些比较典型的文件:

array.xml 定义数组
colors.xml 定义color drawable和颜色的字符串值(color string values)
dimens.xml 定义尺寸值(dimension value)
strings.xml 定义字符串(string)值
styles.xml 定义样式(style)对象

/xml文件夹当然下也是xml文件,但是是需要用getXML()即时取读使用的信息值。

/menu菜单文件,xml文件,Android 中的菜单分为选项菜单、上下文菜单和子菜单,都可以在 XML文件中声明定义。通过R.menu.my_men
的方式来引用。典型菜单资源文件的结构:<menu> 根元素,在根元素里会嵌套 <item> 和 <group> 子元素,<item> 元素中也可嵌套 <menu> 形成子菜单。

/layout文件夹下放置的是屏幕布局资源文件(xml格式),,关于布局内容较多,接下来会具体介绍。

而在和/res文件夹同级的/assets文件夹下也可以存放资源文件但是这些资源文件是不进行编译加工的原生文件,没有标记好的资源id,使用时用AssetManager
以字节流的形式读取文件。

1. 先在 Activity 里面调用 getAssets() 来获取 AssetManager 引用。
2. 再用 AssetManager 的 open(String fileName, int accessMode) 方法则指定读取的文件以及访问模式就能得到输入流 InputStream。
3. 然后就是用已经 open file 的 inputStream 读取文件,读取完成后记得 inputStream.close()。
4. 调用 AssetManager.close() 关闭 AssetManager。

所以关键来了,/res文件夹下的资源文件最特别的就在于通过预编译自动生成的R类拥有标记好的id,通过id即可获取对应资源。在曾经的eclipse项目中还可以看到这个R类,但由于这个R类并不需要我们手动设置所以在Android-Studio工程目录种并未显示出来。



Android资源系统保存所有与代码无关资源的存根。可以使用Resources 访问应用程序的资源;与应用程序相关联的资源实例可以通过Context.getResources()得到。
一个应用程序的资源可以被构建系统在构建时编译进二进制的应用程序里。在构建过程的部分,每个资源的标识被产生,可以在代码中使用。这些标识允许编译器校验您应用程序中的代码和资源定义是否匹配。

在代码中引用资源

R.资源类型.资源名称

写出对应资源的R.resource_type.resource_name 或者 android.R.resource_type.resource_name即可,

其中resource_type是 R 的子类,保存资源的一个特定类型。

resource_name 是在XML文件定义的资源的name属性,或者有其他文件类型为资源定义的文件名(不包含扩展名,这指的是drawable文件夹里面的icon.png类似的文件,name=icon)Android 包含了很多标准资源,如屏幕样式和按钮背景。要在代码中引用这些资源,你必须使用 android进行限定,如android.R.drawable.button_background。

也可以用context.getResoures()获取到Resources对象来获取资源

在xml文件内引用资源

@[包名称:]资源类型/资源名称

1) 引用自定义的资源

android:text="@string/hello" 这里使用 "@" 前缀引入对一个资源的引用

在 @[package:]type/name形式中后面的文本是资源的名称。在这种情况下,我们不需要指定包 名,因为我们引用的是我们自己包中的资源。type xml子节点名,name是xml属性名:Hello World, HelloDemo!

2) 引用系统资源android:textColor="@android :color/opaque_red"指定package:android

3) 引用主题属性 另外一种资源值允许你引用当前主题中的属性的值。这个属性值只能在样式资源和XML属性中使用;它允许你通过将它们改变为当前主题提供的标准变化来改变UI元素的外观,而不是提供具体的值。android:textColor="?android:textDisabledColor"注意,这和资源引用非常类似,除了我们使用一个"?"前缀代替了"@"。当你使用这个标记时,你就提供了属性资源的名称,它将会在主题中被查找 -- 因为资源工具知道需要的属性资源,所以你不需要显示声明这个类型(如果声明,其形式就
是?android:attr/android:textDisabledColor)。除了使用这个资源的标识符来查询主题中的值代替原始的资源,其命名语法和 "@"形式一致:?[namespace:]type/name,这里类型可选。

具体如下:

ColorValue语法:#color_value 保存在 res/values/colors.xml (文件名可以任意)。
xml引用:android:textColor="@color/color_name"
Java 引用: int color = Resources.getColor(R.color.color_name)
其中 #color_value 有以下格式(A 代表 Alpha 通道): #RGB #ARGB #RRGGBB #AARRGGBB xml 示例 (声明两个颜色,第一个不透明,第二个透明色):#f00 #80ff0000

ColorDrawables语法: color_value 保存在 res/values/colors.xml。
xml 引用:android:background="@drawable/color_name"
java 引用:Drawable redDrawable = Resources.getDrawable(R.drawable.color_name) color_name 和上面的一样。

res/drawable下的图片(官方提示 png (preferred), jpg (acceptable), gif (discouraged),使用png格式比较好)
xml引用 @[package:]drawable/some_file
java引用 R.drawable.some_file 引用是不带扩展名

dimension语法:dimen_value单位,保存为res/values/dimen.xml。

(度量单位:

px:pixel,屏幕实际的象素,电子屏幕上组成一幅图画或照片的最基本单元,常说的分辨率 1024*768pixels,就是横向1024px, 纵向768px,不同设备显示效果相同。

pt: point,点,幕的物理尺寸,印刷行业常用单位,等于 1/72 英寸
in(英寸): 屏幕的物理尺寸, 每英寸等于 2.54 厘米。

mm(毫米): 屏幕的物理尺寸。

ppi: pixel per inch,每英寸像素数,该值越高,则屏幕越细腻
dpi: dot per inch,每英寸多少点,该值越高,则图片越细腻

dp: dip,Density-independent pixel,与密度无关的象素,一种基于屏幕密度的抽象单位。 是安卓开发用的长度单位,1dp 表示在屏幕像素点密度为 160ppi 时 1px 长度,也就是在每英寸160点的显示器上,1dp=1px。
sp: scale-independent pixel,与刻度无关的象素,安卓开发用的字体大小单位best for textsize


XML: android:textSize="@dimen/some_name"
Java: float dimen = Resources.getDimen(R.dimen.some_name)

其他类型资源(strings,values等等)都类似。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: