尽管 Android 系统提供了很多样式和主题,但有时这些效果并不能实现特殊的效果或者风格,此时就可以自定义样式和主题。定义样式和主题的步骤如下:
(1) 在 res/values 目录下创建一个样式文件 style.xml (文件名字可以自定义),添加一个 <resources> 根结点。
(2)在<resources>结点中添加一个<style>节点,并在该节点中为样式或主题定义一个唯一的名字,也可以选择增加一个父类属性,表示当前风格继承父类的风格。
(3)在<style>节点中声明一个或多个<item>,每个<item>节点需要定义一个属性名,并在元素内部设置这个属性的值。
为了让初学者更好地学习,接下来通过一个具体的案例来演示如何自定义样式和主题。具体步骤如下:
1. 创建样式和主题
创建一个名为 “Style” 的应用程序,将包名修改为 cn.itcast.style。在 res/ values 目录中添加一个用于定义样式的文件,名为 mystyle.xml(文件名必须小写),具体如图1 所示。
图 1 mystyle.xml
mystyle.xml 文件中定义的样式和主题,具体如下所示:
<resources>
<style name="TextStyle">
<item name="android:layout_width">wrap_content</item>
<item name="android:layout_height">wrap_content</item>
<item name="android:textSize">30dip</item>
<item name="android:textColor">#990033</item>
</style>
<style name="MyTheme">
<item name="android:background">#D9D9D9</item>
</style>
</resources>
上述代码在 <style name="TextStyle">节点中设置了一个样式,定义了控件宽度和高度为wrap_content 显示全部内容,字体大小为 30dip,字体颜色为红色。<style name="MyTheme"> 结点用于设置 Activity 背景色为灰色。
2. 使用自定义样式和主题
在 activity_main.xml 的<TextView>控件中,通过 style="@style/TextStyle"引入定义好的样式,具体代码如下所示:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity" >
<TextView
style="@style/TextStyle"
android:layout_centerInParent="true"
android:text="自定义样式" />
</RelativeLayout>
在 AndroidManifest.xml 的<activity>节点中,通过 android:theme="@style/MyTheme"引入定义好的主题,具体代码如下所示:
<activity
android:name="cn.itcast.style.MainActivity"
android:theme="@style/MyTheme"
android:label="@string/app_name" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
上述代码中,就是将定义好的主题运用于当前 Activity 之中。接下来运行当前程序,结果如图2 所示。
图 2 自定义样式和主题
从图2 可以看出,整个 Activity的背景是灰色,这个就是 android:theme="@style/MyTheme"主题的作用。布局中没有对 TextView 定义高度、宽度以及字体颜色,但该 TextView 依然正常显示并且字体颜色变成了红色,这就是 style="@style/TextStyle"样式的作用。
继承其他样式
自定义的样式还可以通过 parent 函数继承其他已经定义好的样式,使程序的扩展性更好,具体代码如下所示:
<?xml version="1.0" encoding="utf-8"?>
<resources>
<style name="MyStyle">
<item name="android:textSize">30dip</item>
<item name="android:textColor">#990033</item>
</style>
<style name="TextStyle" parent="MyStyle">
<item name="android:layout_width">wrap_content</item>
<item name="android:layout_height">wrap_content</item>
</style>
</resources>
上述代码中,MyStyle定义了字体的大小颜色,TextStyle中通过 parent 函数继承 MyStyle 中的属性,这种方法设置样式的效果与图2是一样的。