关闭

Android 用户界面---样式和主题(Styles and Themes)(一)

2912人阅读 评论(2) 收藏 举报

样式是给ViewWindow指定外观和格式的属性集合。样式能够指定如高、边距、字体颜色、字体尺寸、背景颜色等属性。样式被定义在一个与布局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中删除了,并且把这些样式放到了一个叫做CodeFontXML样式定义中,然后把它设置给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属性,把文本设置为红色。使用@style/CodeFont.Red来引用这个样式。

通过用点把名字连接方法,可以实现样式的层次继承,如可以把上面的CodeFont.Red样式扩展成设置字体的样式:

    <stylename="CodeFont.Red.Big">
       
<itemname="android:textSize">30sp</item>
   
</style>

这个样式继承了CodeFontCodeFont.Red样式,然后添加了android:textSize属性。

注意:这种通过把名字连接在一起的继承性只对自己定义的样式有效。不能用这种方法来继承Android内置的样式。要引用内置的样式,如TextAppearance样式,就必须使用parent属性。

2
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:2065218次
    • 积分:25293
    • 等级:
    • 排名:第234名
    • 原创:85篇
    • 转载:14篇
    • 译文:442篇
    • 评论:186条
    最新评论