Android资源使用详解(一)
一、Android资源简介
Android应用资源可分为两大类:(1)无法通过R清单类访问的原生资源,保存在assets目录下;(2)可通过R资源清单类访问的资源,保存在res目录下。其中,res目录下应用资源介绍如下:
目录Directory | 资源类型Resource Types |
res/anim/ | XML文件,它们被编译进逐帧动画(frame by frame animation)或补间动画(tweened animation)对象 |
res/drawable/ | .png、.9.png、.jpg文件,它们被编译进以下的Drawable资源子类型中: 要获得这种类型的一个资源,可以使用Resource.getDrawable(id) 位图文件 9-patches(可变尺寸的位图) 为了获取资源类型,使用mContext.getResources().getDrawable(R.drawable.imageId) 注意:放在这里的图像资源可能会被aapt工 具自动地进行无损压缩优化。比如,一个真彩色但并不需要256色的PNG可能会被转换为一个带调色板的8位PNG。这使得同等质量的图片占用更少的资源。 所以我们得意识到这些放在该目录下的二进制图像在生成时可能会发生变化。如果你想读取一个图像位流并转换成一个位图(bitmap),请把图像文件放在 res/raw/目录下,这样可以避免被自动优化。 |
res/layout/ | 被编译为屏幕布局(或屏幕的一部分)的XML文件。 |
res/values/ | 可以被编译成很多种类型的资源的XML文件。 注意: 不像其他的res/文件夹,它可以保存任意数量的文件,这些文件保存了要创建资源的描述,而不是资源本身。XML元素类型控制这些资源应该放在R类的什么地方。 尽管这个文件夹里的文件可以任意命名,不过下面使一些比较典型的文件(文件命名的惯例是将元素类型包含在该名称之中): array.xml 定义数组 colors.xml 定义color drawable和颜色的字符串值(color string values)。使用Resource.getDrawable()和Resources.getColor()分别获得这些资源。 dimens.xml定义尺寸值(dimension value)。使用Resources.getDimension()获得这些资源。 strings.xml定义字符串(string)值。使用Resources.getString()或者Resources.getText()获取这些资源。getText()会保留在UI字符串上应用的丰富的文本样式。 styles.xml 定义样式(style)对象。 |
res/xml/ | 任意的XML文件,在运行时可以通过调用Resources.getXML()读取。 |
res/raw/ | 直接复制到设备中的任意文件。它们无需编译,添加到你的应用程序编译产生的压缩文件中。要使用这些资源,可以调用Resources.openRawResource(),参数是资源的ID,即R.raw.somefilename。 |
注:res目录下的资源主要通过引用R.jaava的变量实现,R类是自动生成的,不能被手动修改。当资源发生变动时,它会自动修改。为了在Java代码中通过资源清单项目来获取实际资源,可以借助于Android提供的Resource类。Resouces类,即Android资源访问总管家,提供了大量的方法来根据资源清单ID获取实际资源。Resources主要提供了如下两类方法:
>getXxx(int id):根据资源清单ID来获取实际资源,如getDrawable(R.drawable.image01)、getXml(R.xml.data);
>getAssets():获取访问 /assets/目录下资源的AssetManager对象;
注:Resources对象需要由Context调用getResources()方法获取。
二、Android资源使用方法
1.使用颜色资源(res/values/colors.xml )
(1)语法
<color name="color_name">#color_value</color>
其中#color_value有以下格式(A代表Alpha透明度):
#RGB:只支持0~f这16级颜色来代表颜色
#ARGB
#RRGGBB:只支持00~ff这256级颜色来代表颜色
#AARRGGBB
(2)引用方法
>xml引用:android:textColor="@color/color_name"
>Java引用: int color = Resources.getColor(R.color.color_name)
(3)xml示例
<?xml version="1.0" encoding="utf-8"?><resources> <color name="opaque_red">#f00</color> <color name="translucent_red">#80ff0000</color></resources>
2.使用尺寸资源(res/values/dimens.xml)(1)语法
<dimen name="dimen_name">dimen_value单位</dimen>
度量单位:
px(象素): 屏幕实际的象素,常说的分辨率1024*768pixels,就是横向1024px, 纵向768px,不同设备显示效果相同。
in(英寸): 屏幕的物理尺寸, 每英寸等于2.54厘米。
mm(毫米): 屏幕的物理尺寸。
pt(点) : 屏幕的物理尺寸。1/72英寸。
dp/dip : 与密度无关的象素,一种基于屏幕密度的抽象单位。在每英寸160点的显示器上,1dp = 1px。但dp和px的比例会随着屏幕密度的变化而改变,不同设备有不同的显示效果。
sp : 与刻度无关的象素,主要用于字体显示best for textsize,作为和文字相关大小单位。
(2)引用方法
>XML引用: android:textSize="@dimen/some_name"
>Java引用: float dimen = Resources.getDimen(R.dimen.some_name)
(3)xml示例
<?xml version="1.0" encoding="utf-8"?><resources> <dimen name="one_pixel">1px</dimen> <dimen name="double_density">2dp</dimen> <dimen name="sixteen_sp">16sp</dimen></resources>
3.使用字符串资源(res/values/strings.xml)(1)语法
<string name="string_name">字符串值</string >
(2)引用方法
>xml引用:android:text="@string/app_name"
>Java引用: String string= Resources.getString(R.string.string_name)
(3)xml示例
<?xml version="1.0" encoding="utf-8"?><resources> <string name="btnName">登录</string > <string name="appName">驾校培训一点通</string ></resources>
4.使用布尔(bool)资源(res/values/bools.xml)(1)语法
<bool name="flag">0/1</bool >
(2)引用方法
>xml引用:android:text="@bool /flag"
>Java引用: String string= Resources.getString(R.bool .flag)
(3)xml示例
<?xml version="1.0" encoding="utf-8"?><resources> <bool name="flag1">0</bool > <bool name="btnStatus">1</bool ></resources>
注:类似的还有Integer资源等
5.使用数组(Array)资源(res/values/arrays.xml) 由于Android中并不推荐在Java代码中定义数组,我们可以通过资源文件来定义数组资源。Android采用位于/res/values/目录下的arrays.xml文件来定义数组,定义数组时XML资源文件的根元素也是<resource.../>元素,该元素内可包含如下三种子元素:
◆<array../>子元素:定义普通类型的数组,例如Drawable数组(R.drawable.image01);
◆<string-array.../>子元素:定义字符串数组;
◆<integer-array.../>子元素:定义整数数组;
(1)引用方法
>xml引用:android:entries = "@array/array_name"
>Java引用:R.array.array_name
另外为了能在Java程序中访问到实际的数组,Resources类提供了如下方法:
◇String[] getStringArray(int id);根据资源文件中字符串数组资源的名称来获取实际的字符串数组
◇int[] getIntArray(int id);根据资源文件中整型数组资源的名称来获取实际的整型数组
◇TypedArray obtainTypedArray(int id);根据资源文件中的普通数组资源的名称来获取实际的普通数组
注:TypedArray代表一个通用类型的数组,该类提供了getXxx(int index)方法来获取指定索引处的数组元素。
(2)xml示例
<?xml version="1.0" encoding="utf-8"?><resources> <!--定义一个Drawable数组--> <array name="plain_arr"> <item>@color/c1</item> <item>@color/c2</item> </array> <!--定义一个String数组--> <string-array name="string_arr"> <item>@string/s1</item> <item>林俊杰</item> </string-array> <!--定义一个整数数组--> <integer-array name="integer_arr"> <item>@dimen /d1</item> <item>12</item> </integer-array></resources>
使用方法:
String[] strings=getResources().getStringArray(R.array.string_arr);
int[] numbers=getResources().getIntArray(R.array.integer_arr);
TypedArray icons = getResources().obtainTypedArray(R.array.plain_arr);
然后使用icons.getDrawable(position)获得资源即可。
6.使用菜单(menu)资源 在Android项目开发中,Android推荐使用XML资源文件来定义菜单。Android菜单资源文件存放在/res/menu目录下,根元素为<menu.../>元素且无需指定任何属性,该根元素包含<item.../>子元素。
(1)引用方法
>xml引用:android:entries = "@menu/menu_name"
>Java引用:R.menu.menu_name
(2)xml示例
- <?xml version="1.0" encoding="utf-8"?>
- <menu xmlns:android="http://schemas.android.com/apk/res/android" >
- <item
- android:id="@+id/close"
- android:icon="@drawable/ic_launcher"
- android:orderInCategory="3"
- android:title="Close"/>
- <item
- android:id="@+id/no_icon"
- android:orderInCategory="2"
- android:title="Sans Icon"/>
- <item
- android:id="@+id/disabled"
- android:enabled="true"
- android:orderInCategory="4"
- android:title="Disabled"/>
- <!-- orderInCategory表示的是item的排序-->
- <group
- android:id="@+id/other_stuff"
- android:menuCategory="secondary"
- android:visible="true" >
- <item
- android:id="@+id/later"
- android:orderInCategory="0"
- android:title="2nd-To-Last"/>
- <item
- android:id="@+id/last"
- android:orderInCategory="1"
- android:title="Last"/>
- </group>
- <!--表示的是二级菜单-->
- <item
- android:id="@+id/submenu"
- android:orderInCategory="3"
- android:title="A Submenu">
- <menu>
- <item
- android:id="@+id/non_ghost"
- android:alphabeticShortcut="n"
- android:title="Non-Ghost"
- android:visible="true"/>
- <item
- android:id="@+id/ghost"
- android:alphabeticShortcut="g"
- android:title="A Ghost"
- android:visible="true"/>
- </menu>
- </item>
- </menu>
7.样式(Style)与主题(Theme)资源
(1)样式(Style)资源使用
Android的样式资源文件放在/res/values目录下,样式资源文件的根元素是<resources.../>元素,该元素内可包含多个<style.../>子元素,每个<style.../>元素定义一个样式。<style.../>元素指定如下两个属性:
>name:指定样式的名称;
>parent:指定该样式所继承的父样式。当继承某个负样式时,该样式将会获得父样式中定义的全部格式。
注:<style.../>元素内可包含多个<item.../>子元素,每个<item.../>子元素定义一个格式项。
XML示例如下:
<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:android="http://schemas.android.com/apk/res/android">
<!-- 定义一个样式,指定字体大小、字体颜色 -->
<style name="style1">
<item name="android:textSize">20sp</item>
<item name="android:padding">8dp</item>
</style>
<!-- 定义一个样式,继承前一个颜色样式 -->
<style name="style2" parent="@style/style1">
<item name="android:background">#000</item>
<item name="android:padding">8dp</item>
</style>
</resources>
(2)主题(Theme)资源使用
主题资源的定义方式与样式类似,XML文件也包括<resource../>、<style../>、<item../>等元素。主题与样式的区别主要在于:
>主题不能作用于单个的View组件,而是对整个应用中的所有Activity起作用或者对指定的Activity起作用;
>主题定义的格式应该是改变窗口外观的格式,例如窗口标题、窗口边框等;
实例:给所有窗口添加边框、背景
◆/res/values/my_themeStyle.xml
<?xml version="1.0" encoding="utf-8"?> <resources xmlns:android="http://schemas.android.com/apk/res/android"> <style name="theme1"> <item name="android:windowNoTitle">true</item> //不显示窗口标题 <item name="android:windowFullscreen">true</item> //窗口全屏 <item name="android:windowFrame">@drawable/window_border<item>//窗口边框样式 <item name="android:windowBackground">#000</item> //窗口背景 </style></resources>
其中,窗口边框样式/res/drawable/window_border.xml
<? xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<!-- 设置四周的内边距 -->
<padding
android:left="7dp"
android:top="7dp"
android:right="7dp"
android:bottom="7dp"/>
<!-- 设置填充颜色 -->
<solid
android:color="#0fff"/>
<!-- 设置边框 -->
<stroke
android:width="10dp"
android:color="#f00" />
</shape>
◆为应用或指定Activity指定主题样式
应用:setTheme(R.style.theme1)或者AndroidManifest.xml中的<application android:theme="@style/theme1"...>
指定Activity:<Activity android:android:theme="@style/theme1".....>
参考:http://www.cnblogs.com/luxiaofeng54/archive/2011/03/15/1984617.html