Android 应用资源的使用方法
文章来自:http://www.cnblogs.com/wolipengbo/p/3438891.html 向作者表示感谢
【Android 资源类型】
Android资源类型分为两大类:
1、无法通过R资源清单文件访问的原生资源,保存在/assets/目录下:
也就是说,放在这个文件中的资源,在SDK对该应用进行编译的时候,不会再R文件中形成索引,所以不可以直接通过使用R类来访问这些资源,需要通过使用AssetManager以二进制流的形式来读取资源
2、可以通过R文件资源清单文件访问的资源,保存在/res/目录下:
这部分资源在SDK编译之后,会在R文件中形成资源索引,可以直接通过使用R类来访问这些资源
【资源的存储位置】
资源的类型以及存储方式
Android要求在res目录下用不同的子目录保存不同的应用资源,表6.1大致显示了Android不同资源在/res目录下的存储方式。
| 目录 | 存放的资源 |
|---|---|
| /res/animator/ | 存放定义属性动画的XML文件 |
| /res/anim/ | 存放定义补间动画的XML文件 |
| /res/color/ | 存放定义不同状态下颜色列表的XML文件 |
| /res/drawable/ |
该目录下存放各种位图文件(如*.png、*.9.png、*.jpg、*.gif等)。除此之外也可是能编辑成如下各种Drawable对象的XML文件:
|
| /res/layout/ | 存放各种用户界面的布局文件 |
| /res/menu/ | 存放为应用程序定义各种菜单的资源,包括选项菜单、子菜单、上下文菜单资源 |
| /res/raw/ |
该目录下存放任意类型的原生资源(比如音频文件、视频文件等)。在Java代码中可通过调用Resources对象的openRawResources(int id) 方法来获取该资源的二进制输入流。实际上,如果应用程序需要使用原生资源,推荐把这些原生资源保存到/assets目录下, 然后在应用程序中使用AssetManager来访问这些资源。 |
| /res/values/ |
存放各种简单的XML文件。这些简单值包括字符串值、整数值、颜色值、数组等。字符串值、整数值、颜色值、数组等各种值都存放在该目录下,而且这些资源文件的根元素都是<resources.../>元素,当我们为该<resources.../>元素添加不同的子元素则代表不同的资源,例如:
由于各种简单值都可定义在/res/values目录下的资源文件中,如果在同一份资源文件中定义各种值,势必增加程序维护的难度。为此,Android建议使用不同的文件来存放不同类型的值,例如,
|
| /res/xml/ | 任意的原生xml文件。这些XML文件可在Java代码中使用Rsources.getXML()方法进行访问 |
一旦将应用程序的各种资源分别保存在Android应用的/res目录下,接下既可以在Java程序中使用这些资源,也可以在其他XML资源中使用这些资源。
【数组资源的定义方式】
<array...../>定义普通数组,例如Drawable数组
<string-array...../>定义字符串数组
<interger-array..../>定义整型数组
【访问资源的方式】
1、Android提供的许多API都接受int型的参数,也就是说,只用这些API能够直接将R.TYPE.Name的形式解析成实际的资源
2、但是有时候我们需要得到实际的资源,比如我们在array.xml文件中创建了一个名为 names的数组,那么我们怎样在Java代码中得到这个数组呢?需要借助于Resource类
获得Resource的方法为:调用context的getResource()方法,Resource类中提供了很多的方法的,能够返回实际的资源
XXX getXXX( int id ) :如 getInt(ID),getString(ID), getDimension( ID ) 等
String [] getStringArray( int id) ;
int [] getIntArray( int id ) ;
TypeArray obtainTypedArray( int id ) :返回普通数组资源,TypeArray代表一个通用类型的数组,该类提供了getXXX(int index)方法获取指定位置处的索引的元素
下面的代码片段展示了使用方法:
1 Resources res = getResources() ; 2 String mainTitle = res.getString(R.string.hello_world) ; 3 Drawable logo = res.getDrawable(R.drawable.ic_launcher); 4 int [ ] arr = res.getIntArray(R.array.books) ; 5 TypeArray icons = res.obtainTypedArray(R.array.plain_arr) ; 6 textView.setBackgroundDrawable(icons.getDrawable(2)); //获取索引为2 的位置的元素
【Drawable资源】
【图片资源】略
【StateListDrawable】
StateListDrawable用于组织多个Drawable对象。当使用StateListDrawable作为目标组件的背景、前景图片时,StateListDrawable对象所显示的Drawable对象会随目标组件状态的改变而自动切换。
定义StateListDrawable对象的XML文件的根元素为<selector.../>,该元素可以包含多个<item.../>元素,该元素可指定如下属性。
- android:color或android:drawable:指定颜色或Drawable对象。
- android:state_xxx:指定一个特定状态。
例如如下语法格式:
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android" >
<!-- 指定特定状态下的颜色 -->
<item android:state_pressed=["true"|"false"] android:color="hex_color" ></item>
</selector>
| 属性值 | 含义 |
| android:state_active | 代表是否处于激活状态 |
| android:state_checkable | 代表是否处于可勾选状态 |
| android:state_checked | 代表是否处于可勾选状态 |
| android:state_endabled | 代表是否处于可用状态 |
| android:state_first | 代表是否处于开始状态 |
| android:state_focused | 代表是否处于已得到焦点状态 |
| android:state_last | 代表是否处于结束状态 |
| android:state_middle | 代表是否处于中间状态 |
| android:state_pressed | 代表是否处于已被按下状态 |
| android:state_selected | 代表是否处于已被选中状态 |
| android:state_window_focused | 代表是否窗口已得到焦点状态 |
实例:高亮显示正在输入的文本框
前面知道,使用EditText时可指定一个android:textColor属性,该属性用于指定文本框的文字颜色。前面介绍该属性时总是直接给它一个颜色值,因此该文本框的文字颜色总是固定的。借助于StateListDrawable对象,可以让文本框的文字颜色随文本框的状态动态改变。
为本系统提供如下Drawable资源文件。
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android" >
<!-- 指定获取焦点时的颜色 -->
<item android:state_focused="true" android:color="#f44" ></item>
<!-- 指定失去焦点时的颜色 -->
<item android:state_focused="false" android:color="#000"></item>
</selector>
上面的资源文件中指定了目标组件得到焦点、失去焦点时使用不同的颜色,接下来可以在定义EditText时使用该资源。
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical">
<!-- 使用StateListDrawable资源 -->
<EditText android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:textColor="@drawable/my_image"/>
<EditText android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:textColor="@drawable/my_image"/>
</LinearLayout>
该应用的Java程序代码不需任何修改,只要显示该界面布局即可。运行该程序将看到如图6.3所示的界面。

通过使用StateListDrawable不仅可以让文本框文字的颜色随文本框状态的改变而切换,也可以让按钮的背景图片随按钮状态的改变而切换。实际上StateListDrawable的功能非常灵活,它可以让各种组件的背景、前景随状态的改变而切换。
【LayerDrawable】
与StateListDrawable有点类似,LayerDrawable也可包含一个Drawable数组,因此系统将会按这些Drawable对象的数组顺序来绘制它们,索引最大的Drawable对象将会将会被绘制在最上面。
定义LayerDrawable对象的XML文件的根元素为<layer-list.../>,该元素可以包含多个<item.../>元素,该元素可以指定如下属性。
- android:drawable:指定作为LayerDrawable元素之一的Drawable对象。
- android:id:为该Drawable对象指定一个标识。
- android:buttom|top|left|button:它们用于指定一个长度值,用于指定将该Drawable对象绘制到目标组件的指定位置。
例如如下语法格式:
<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android" >
<!-- 定义轨道的背景 -->
<item android:id="@android:id/background"
android:drawable="@drawable/grow"></item>
<!-- 定义轨道上已完成的部分外观 -->
<item android:id="@android:id/progress"
android:drawable="@drawable/ok"></item>
</layer-list>
实例:定制拖动条的外观
前面知道,使用SeekBar时可指定一个android:progressDrawable属性,该属性可改变SeekBar的外观,借助于LayerDrawable即可改变SeekBar的规定、已完成部分Drawable对象。
例如定义如下Drawable资源 my_bar.xml:
<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android" >
<!-- 定义轨道的背景 -->
<item android:id="@android:id/background"
android:drawable="@drawable/grow"></item>
<!-- 定义轨道上已完成的部分外观 -->
<item android:id="@android:id/progress"
android:drawable="@drawable/ok"></item>
</layer-list>
除此之外,该示例还定义了如下LayerDrawable对象 layout_logo.xml:
<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android" >
<item >
<bitmap android:src="@drawable/ic_launcher"
android:gravity="center"/>
</item>
<item android:top="25dp" android:left="25dp">
<bitmap android:src="@drawable/ic_launcher"
android:gravity="center"/>
</item>
<item android:top="50dp" android:left="50dp">
<bitmap android:src="@drawable/ic_launcher"
android:gravity="center"/>
</item>
</layer-list>
上面的程序中定义了三个“层叠”在一起的Drawable对象,接着在界面布局文件中使用上面的my_bar.xml定义的Drawable对象来改变SeekBar的外观,并通过ImageView来显示上面的layout_logo的Drawable组件。界面布局的代码片段如下:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical" >
<!-- 定义一个拖动条,并改变轨道外观 -->
<SeekBar android:id="@+id/bar"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:max="100"
android:progressDrawable="@drawable/my_bar"/>
<ImageView android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/layout_logo"/>
</LinearLayout>
该程序的代码无须改变,直接加载、显示上面的界面布局文件即可,运行该程序出现如图6.4所示的界面。

可见使用LayerDrawable可以实现图片的叠放效果
【ShapeDrawable】
ShapeDrawable用于定义一个基本的几何图形(如矩形、圆形、线条等),定义ShapeDrawable的XML文件的根元素是<shape.../>元素,该元素可指定如下属性。
- android:shape=["rectangel"|"oval"|"line"|"ring"]:指定定义哪种类型的集合图形。
定义ShapeDrawable对象的完整语法格式如下:
<shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape=["rectangle" | "oval" | "line" | "ring"]> <!-- 定义几何图形的四个角的弧度--> <corners android:radius="integer" android:topLeftRadius="integer" android:topRightRadius="integer" android:bottomLeftRadius="integer" android:bottomRightRadius="integer"/> <!--定义使用渐变色填充 --> <gradient android:angle="integer" android:centerX="integer" android:centerY="integer" android:centerColor="integer" android:endColor="color" android:gradientRadius="integer" android:startColor="color" android:type=[ " linear" | "radial" | "sweep"] android:useslevel=["true" |"false"]/> <!-- 定义几何形状的内边框 --> <padding android:left="integer" android:top="integer" android:right="integer" android:bottom="integer"/> <!-- 定义几何图形的大小 --> <size android:width="integer" android:color="color" android:dashWidth="integer" android:dashGap="integer"/> <!-- 定义使用单种颜色填充 --> <solid android:color="color"/> <!-- 定义为几何图形绘制边框 --> <stroke android:width="integer" android:color="color“ android:dashWidth="integer" android:dashGap="integer"/> </shape>
下面通过示例来介绍ShapeDrawable资源的定义和使用。
实例:椭圆形、渐变背景的文本框
前面介绍TextView时知道该组件可指定一个android:background属性,该属性用于为该文本框指定背景。大部分时候,文本框背景只是一个简单的图片,或者只是一个简单的颜色。
如果程序使用ShapeDrawable资源作为文本框的android:background属性,则可以在Android应用中做出各种外观的文本框。下面先定义如下的ShapeDrawable资源。
程序清单:my_shape_1.xml文件
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle" >
<!-- 设置填充颜色 -->
<solid android:color="#fff"/>
<!-- 设置四周的内边距 -->
<padding android:left="7dp"
android:top="7dp"
android:right="7dp"
android:bottom="7dp"/>
<!-- 设置边框 -->
<stroke android:width="3dp" android:color="#ff0"/>
</shape>
接下来定义如下ShapeDrawable资源
程序清单:my_shape_2.xml文件
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle" >
<!-- 定义填充渐变颜色 -->
<gradient android:startColor="#FFFF0000"
android:endColor="#80FF00FF"
android:angle="45" />
<!-- 设置内填充 -->
<padding android:left="7dp"
android:top="7dp"
android:right="7dp"
android:bottom="7dp"/>
<!-- 设置圆角矩形 -->
<corners android:radius="8dp"/>
</shape>
在定义如下ShapeDrawable资源。
程序清单:my_shape_3.xml文件
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="oval" >
<!-- 定义填充渐变颜色 -->
<gradient android:startColor="#ff0"
android:endColor="#00f"
android:angle="45"
android:type="sweep"/>
<!-- 设置内填充 -->
<padding android:left="7dp"
android:top="7dp"
android:right="7dp"
android:bottom="7dp"/>
<corners android:radius="8dp"/>
</shape>
定义了上面三个ShapeDrawable资源之后,接下来在界面布局文件中用这三个ShapeDrawable资源作为文本框的背景。界面布局文件代码如下。
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical"
>
<EditText android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:background="@drawable/my_shape_1"/>
<EditText android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:background="@drawable/my_shape_2"/>
<EditText android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:background="@drawable/my_shape_3"/>
</LinearLayout>
使用Activity加载、显示上面的界面布局文件,将可以看到如图6.5所示的界面。

【ClipDrawable】
ClipDrawable代表从其他位图上截取的一个"图片片段"。在XML文件中定义ClipDrawable对象使用<clip.../>元素,该元素的语法为:
<?xml version="1.0" encoding="utf-8"?>
<clip
xmlns:android="http://schemas.android.com/apk/res/android"
android:drawable="@drawable/drawable_resource"
android:clipOrientation=["horizontal" | "vertical"]
android:gravity=["top" | "bottom" | "left" | "right" | "center_vertical" |
"fill_vertical" | "center_horizontal" | "fill_horizontal" |
"center" | "fill" | "clip_vertical" | "clip_horizontal"] />
上面的语法格式中可指定如下三个属性:
- android:drawable:指定截取的源Drawable对象。
- android:clipOrientation:指定截取方向,可设置水平截取或垂直截取。
- android:gravity:指定截取时的对齐方式。
使用ClipDrawable对象时可调用setLevel(int level)方法来设置截取的区域大小,当level为0时,截取的图片片段为空;当level为10000时,截取整张图片。
下面以一个示例来说明ClipDrawable对象的用法。
实例:徐徐展开的风景
因为ClipDrawable对象可调用setLevel(int level)控制截取图片的部分,因此本示例只要设置一个定时器,让程序不断调用ClipDrawable的setLevel(int level)方法即可实现图片徐徐展开的效果。
程序先定义如下ClipDrawable对象。
程序清单my_clip.xml
<?xml version="1.0" encoding="utf-8"?>
<clip xmlns:android="http://schemas.android.com/apk/res/android"
android:drawable="@drawable/shuangta"
android:clipOrientation="horizontal"
android:gravity="center" >
</clip>
之后在主布局文件中的ImageView中使用这个Drawable main.xml文件:
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent" > <ImageView android:id="@+id/image" android:layout_width="fill_parent" android:layout_height="wrap_content" android:scaleType="fitStart" android:src="@drawable/my_clip" /> </LinearLayout>
上面的程序控制从中间开始截取图片,截取方向为水平截取。接下来程序将通过一个定时器来定期修改ClipDrawable对象的level,即可实现图片徐徐展开的效果。
package com.example.studyresources;
import java.util.Timer;
import java.util.TimerTask;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.app.Activity;
import android.graphics.drawable.ClipDrawable;
import android.view.Menu;
import android.widget.ImageView;
public class ClipDrawableTest extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_clip_drawable_test);
ImageView imageView=(ImageView)findViewById(R.id.image);
//获取图片所显示的ClipDrawable对象
final ClipDrawable drawable=(ClipDrawable)imageView.getDrawable();
final Handler handler=new Handler()
{
@Override
public void handleMessage(Message msg) {
// TODO Auto-generated method stub
//如果该程序是本程序所发送的
if(msg.what==0x123)
{
//修改ClipDrawable的level值
drawable.setLevel(drawable.getLevel()+200);
}
}
};
final Timer timer=new Timer();
timer.schedule(new TimerTask(){
@Override
public void run() {
// TODO Auto-generated method stub
Message msg=new Message();
msg.what=0x123;
//发送消息,通知应用修改ClipDrawable对象的Level值
handler.sendMessage(msg);
//取消定时器
if(drawable.getLevel()>=10000)
{
timer.cancel();
}
}
}, 0,300);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.clip_drawable_test, menu);
return true;
}
}
运行上面的程序,将看到如图6.6所示的结果。

从图6.6所示的运行结果可以看出,通过使用这种徐徐展开的图片,用户会感觉就像进度条一样
实际上,实际应用中完全可以用这种ClipDrawable对象来实现图片进度条。
【Style资源文件】
如果我们经常需要对某个类型的组件指定大致相似的格式,比如字体、颜色、背景色等,如果每次都要为View组件重复指定这些属性,无疑会有大量的工作量,而且不利于项目后期的维护。
类似于World、World也提供了样式来管理格式:一个样式等于一组格式的集合,如果设定某段文本使用某个样式,那么该样式的所有格式都会整体应用于这段文本。Android的样式与此类似,Android样式也包含一组格式,为一个组件设置某个样式时,该样式所包含的全部格式将会应用于该组件。
提示:一个样式相当于多个格式的集合,其他UI组件通过style属性来指定样式,这就相当于把该样式包含的所有格式同时应用于该UI组件。
Android的样式资源文件也放在/res/values 目录下,样式资源文件的根元素是<resources.../>元素,该元素内可包含多个<style.../>子元素,每个<style.../>元素定义一个样式。<style.../>元素指定如下两个属性。
- name:指定样式的名称。
- parent:指定该样式所继承的父样式。当继承某个父样式时,该样式将会获得父样式中定义的全部样式。当然,当前样式也可覆盖父样式中指定的格式。
<style.../>元素内包含多个<item.../>子元素,每个<item.../>子元素定义一个格式项。
例如为应用定义如下样式文件。
程序清单:\res\values\my_style.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:textColor">#00d</item>
</style>
<!-- 定义一个 样式,继承前一个样式-->
<style name="style2" parent="@style/style1" >
<item name="android:background">#ee6</item>
<item name="android:padding">8dp</item>
<!-- 覆盖样式中指定的属性 -->
<item name="android:textColor" >#000</item>
</style>
</resources>
上面的样式资源只能怪定义了两个样式,其中第二个样式继承了第一个样式,而且第二个样式中的textColor属性覆盖了父样式中的textColor属性。
一旦定义了上面的样式资源之后,接下来就可以在XML资源中按如下语法格式来使用样式了:
@[<package_name>:]style/file_name
下面是该示例中的界面布局文件,该布局文件中包含两个文本框,这两个文本框分别使用两个样式。
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical"
>
<!-- 指定使用style1的样式 -->
<EditText android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="样式1的格式"
style="@style/style1"/>
<!-- 指定使用style2的样式 -->
<EditText android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="样式2的格式"
style="@style/style2"/>
</LinearLayout>
上面的界面布局文件中并未为两个文本框指定任何格式,只是为它们分别指定了使用style1、style2的样式,这两个样式包含的格式就会应用到这两个文本框。运行上面的程序,将看到如图6.10所示的界面。

【Theme主题资源】
与样式资源非常相似,主题资源的XML文件通常也放在/res/values 目录下,主题资源的XML文档同样以<resources.../>元素作为根元素,同样使用<style.../>元素来定义主题。
主题与样式的区别主要体现在:
- 主题不能作用于单个的View组件,主体应该对整个应用的所有Activity起作用,或对指定的Activity起作用。
- 主题定义的格式应该是改变窗口外观的格式,例如窗口标题、窗口边框等。
实例:给所有窗口添加边框、背景
下面通过一个示例来介绍主题的用法。为了给所有的窗口都添加边框、背景,先在/res/values/my_new_style.xml文件中增加一个主题,定义主体的<style.../>片段如下:
<?xml version="1.0" encoding="utf-8"?>
<resources>
<style name="CrazyTheme">
<item name="android:windowNoTitle">true</item>
<item name="android:windowFullscreen">true</item>
<item name="android:windowFrame">@drawable/window_border</item>
<item name="android:windowBackground">@drawable/star</item>
</style>
</resources>
上面的主题定义中使用了两个Drawable资源,其中@drawable/star是一张图片;@drawable/window_border是一个ShapeDrawable资源,该资源对应的XML文件代码如下:
\res\drawable_mdpi\wndow_border.xml
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle" >
<!-- 设置填充颜色 -->
<solid android:color="#0fff"/>
<!-- 设置四周的内边距 -->
<padding android:left="7dp"
android:top="7dp"
android:right="7dp"
android:bottom="7dp"/>
<!-- 设置边框 -->
<stroke android:width="10dip" android:color="#f00"/>
</shape>
定义了上面主题之后,接下来即可在Java代码中使用该资源,例如如下代码:
package com.example.studyresources;
import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;
public class StyleResTest extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setTheme(R.style.CrazyTheme);
setContentView(R.layout.activity_style_res_test);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.style_res_test, menu);
return true;
}
}
大部分时候,在AndroidManifest.xml文件中对指定应用、指定Activity应用主题更加简单。如果我们想让应用中全部窗口使用该主题,只要为<application.../>元素增加android:theme属性。属性是一个主题的名字,如以下代码所示:
<application android:theme="@style/CrazyitTheme">
...
</application>
如果你只想让程序中的某个Activity拥有这个主题,那么你可以修改<activity.../>元素,同样通过android:theme指定主题即可。 本应用在代码中指定使用的样式,运行可看到如图6.11所示的界面。

从图6.11所示的效果可以看出,该窗口没有标题,窗口背景也被改变了,窗口全屏显示......这些都是自定义主题控制的。
Android中提供了几种内置的主题资源,这些主题通过查询Android.R.style类可以看到。
例如前面介绍的对话框风格的窗口,我们只要采用如下代码来定义某个Activity即可。
<application android:theme="@android:style/Theme.Dialog">
...
</application>
与样式类似的是,Android主题同样支持继承。如果开发过程中还想利用某个主题,但需要对它们进行布局修改,则可通过继承系统主题来实现自定义主题。例如如下代码片段:
<style name="CrazyTheme" parent="@android:style/Theme.Dialog">
...
</style>
上面定义的CrazyTheme主题继承了android.R.style.Theme.Dialog主题,那么接下来在该<style.../>元素中添加<item.../>子元素就可覆盖系统主题的部分属性了。
有一点值得注意的:虽然theme和style使用同样的<style.../>和<item.../>元素,但是我们为了区分普通的style和专门用于theme的style,为theme单独在value文件夹中创建一个 名为themes.xml的文件,使用方法和上面的说的一样,不用做任何改动,还是使用android:theme=“@style/mytheme” 的语法形式同时,一般我们在theme的style中设置的是一种整体的属性,如窗口、背景等等,但是我们也可以设定字体大小颜色等属性,一旦我们设置了字体属性的话,那么使用这个theme的所有的Activity的字体都是设定的字体风格,有时改变字体的大小会非常的美观
下面介绍一下Android自带的一些主题资源:
android:theme="@android:style/Theme.Dialog" : Activity显示为对话框模式
android:theme="@android:style/Theme.NoTitleBar" : 不显示应用程序标题栏
android:theme="@android:style/Theme.NoTitleBar.Fullscreen" : 不显示应用程序标题栏,并全屏
android:theme="Theme.Light ": 背景为白色
android:theme="Theme.Light.NoTitleBar" : 白色背景并无标题栏
android:theme="Theme.Light.NoTitleBar.Fullscreen" : 白色背景,无标题栏,全屏
android:theme="Theme.Black" : 背景黑色
android:theme="Theme.Black.NoTitleBar" : 黑色背景并无标题栏
android:theme="Theme.Black.NoTitleBar.Fullscreen" : 黑色背景,无标题栏,全屏
android:theme="Theme.Wallpaper" : 用系统桌面为应用程序背景
android:theme="Theme.Wallpaper.NoTitleBar" : 用系统桌面为应用程序背景,且无标题栏
android:theme="Theme.Wallpaper.NoTitleBar.Fullscreen" : 用系统桌面为应用程序背景,无标题栏,全屏
android:theme="Theme.Translucent : 透明背景
android:theme="Theme.Translucent.NoTitleBar" : 透明背景并无标题
android:theme="Theme.Translucent.NoTitleBar.Fullscreen" : 透明背景并无标题,全屏
android:theme="Theme.Panel ": 面板风格显示
android:theme="Theme.Light.Panel" : 平板风格显
这些仅仅是一小部分,还有许多的主题,我们可以通过使用MyEclipse中的快速提示匹配来查看,或者查阅官方文档尝试着使用其他的theme,多尝试就有收获


浙公网安备 33010602011771号