样式是给View或Window指定外观和格式的属性集合。样式能够指定如高、边距、字体颜色、字体尺寸、背景颜色等属性。样式被定义在一个与布局XML文件分开的XML资源文件中。
Android中的样式与Web设计中的层叠式样表类似,允许与内容分开设计。
例如,通过使用样式,可以把下面这个布局XML转换成引用样式的声明:
不使用样式属性:
<TextView android:layout_width="fill_parent" android:layout_height="wrap_content" android:textColor="#00FF00" android:typeface="monospace" android:text="@string/hello" />
使用样式属性:
<TextView style="@style/CodeFont" android:text="@string/hello" />
上例中所有的样式相关的属性都被从布局XML中删除了,并且把这些样式放到了一个叫做CodeFont的XML样式定义中,然后把它设置给style属性。
主题是应用与整个Activity或应用程序的样式,而不是一个独立的View对象。当一个样式被用作主题时,Activity或应用程序中的每个View对象都会使用它所支持的每个样式属性。例如,把相同的CodeFont样式用作一个Activity的主题,那么这个Activity内的所有文本都会使绿色等宽字体。
定义样式
要创建一个样式集,就要把一个XML文件保存项目目录的res/values目录中。XML文件的名字是随意的,但是必须使用.xml扩展名,并且保存在res/values文件夹中。
这个XML文件的根节点必须是<resources>
对于要创建的每个样式,都要在这个XML文件中添加一个<style>元素,并永name属性唯一的标识这个样式(这个属性是必须的),然后给样式的每个属性添加一个<item>元素,这个元素的name属性用于声明样式的属性名,属性值被放在一组<item>之间。给<item>元素的值能够是一个字符串、十六进制的颜色、另一个资源类型的引用、或者依赖样式属性的其他值,下例是一个单一样式的示例文件:
<?xml version="1.0" encoding="utf-8"?><resources> <style name="CodeFont" parent="@android:style/TextAppearance.Medium"> <item name="android:layout_width">fill_parent</item> <item name="android:layout_height">wrap_content</item> <item name="android:textColor">#00FF00</item> <item name="android:typeface">monospace</item> </style></resources>
<resources>元素的每个子元素在编译时都要被转换成一个应用程序资源对象,通过<style>元素的name属性值来引用。这个示例的样式,在XML布局中使用@style/CodeFont来引用。
<style>元素中的parent属性是可选的,它指定了另一个样式的资源ID,当前样式可以继承这个指定样式的属性,然后如果需要,可以覆写被继承的样式属性。
请记住,把XML中定义的一个样式用作一个Activity或应用程序的主题与给一个View对象定义样式完全相同。如上面示例中定义的样式能够被应用于一个View对象,或者用作一个Activity或应用程序的主题。
样式继承性
<style>元素中的parent属性可以继承一个既存的样式属性,然后只定义需要改变和添加的属性。你能够继承自己定义的样式,也可以继承平台内置的样式。例如,下例继承了Android平台的默认文本外观并且修改了文本的颜色:
<stylename="GreenText"parent="@android:style/TextAppearance"> <itemname="android:textColor">#00FF00</item> </style>
如果想要继承自己定义的样式,就不必使用parent属性,但是要把想要继承的样式名做新样式名的前缀(用点分开)。如,要创建一个新的继承上面定义的CodeFont样式的样式,但是要使用红色的文字,可以设计以下新样式:
<stylename="CodeFont.Red"> <itemname="android:textColor">#FF0000</item> </style>
注意在<style>标签中没有parent属性,但是因为name属性值用CodeFont样式名开始(这个样式已经被创建),所以这个样式会继承CodeFont样式定义的所有样式,然后它覆写了android:textColor属性,把文本设置为红色。来引用这个样式。
通过用点把名字连接方法,可以实现样式的层次继承,如可以把上面的CodeFont.Red样式扩展成设置字体的样式:
<stylename="CodeFont.Red.Big"> <itemname="android:textSize">30sp</item> </style>
这个样式继承了CodeFont和CodeFont.Red样式,然后添加了android:textSize属性。
注意:这种通过把名字连接在一起的继承性只对自己定义的样式有效。不能用这种方法来继承Android内置的样式。要引用内置的样式,如TextAppearance样式,就必须使用parent属性。