一、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) 为了获取资源类型,使用mContext.getResources().getDrawable(R.drawable.imageId) 注意:放在这里的图像资源可能会被aapt工 具自动地进行无损压缩优化。比如,一个真彩色但并不需要256色的PNG可能会被转换为一个带调色板的8位PNG。这使得同等质量的图片占用更少的资源。 |
res/layout/ |
被编译为屏幕布局(或屏幕的一部分)的XML文件。 |
res/values/ |
可以被编译成很多种类型的资源的XML文件。 注意: 不像其他的res/文件夹,它可以保存任意数量的文件,这些文件保存了要创建资源的描述,而不是资源本身。XML元素类型控制这些资源应该放在R类的什么地方。 尽管这个文件夹里的文件可以任意命名,不过下面使一些比较典型的文件(文件命名的惯例是将元素类型包含在该名称之中): array.xml 定义数组 colors.xml 定义color dimens.xml定义尺寸值(dimension 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>
然后,再在布局文件中通过@style/style_name使用自定义样式即可。
(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