样式和主题(Styles and Themes)

来源:互联网 发布:网络护犊子是什么意思 编辑:程序博客网 时间:2024/05/22 18:53

样式和主题(Styles and Themes)


文章位置:Develop>API Guides>User Interface>Styles and Themes

样式是指定一个view或者window的样子和格式的属性的集合。一个样式可以指定的属性有高,内边距,字体颜色大小,背景色及更多。


样式定义在一个不同于布局(layout)文件的XML资源文件中。


安卓中的样式和网页设计的层叠样式表(css)是相同的设计思想-允许将设计从内容分离出来。
例如,用一个样式,你可以用下面这个布局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的样式定义里,然后应用样式的属性。
你会在下面的部分看到这个样式的定义。

主题是一个样式应用到一个activity实体或者app,而不是一个单独的view(像上面的例子)。
当一个样式被用在主题里,在activity或者app中的每个view将使用主题中他支持的所有属性。
例如,你可以用相同CodeFont样式作为一个activity的主题进而所有在activity中的文本将会变成绿色等宽的字体。

一、定义样式

创造一组样式,保存成XML文件放在你工程的res/values/目录下。文件名称任意,但是必须用.xml为扩展名并保存在res/values/下。
XML文件根节点必须是<resources>.
每一个你想创建的样式,在文件中增加<style>标签并且定义唯一的样式名称(这个属性是必须的)。
然后给样式的每一个属性增加一个<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>的子节点元素都会被转为一个app的资源对象,这个对象会引用<style>元素对应名称的值属性。
这个样式的例子可以在布局文件中用 @style/CodeFont来引用(就像上面的例子)

在<style>中的parent属性是可选的,可以指定另一个有继承属性样式的资源ID。如果你有需要可以覆写继承样式的属性。

记住,一个定义在XML中主题上的样式用于activity或者app和用于view的样式是一样的。
(a style that you want to use as an Activity or application theme is defined in XML exactly the same as a style for a View)
像上面定义的样式一样,一个样式可以当作样式指定一个单个view或者当作定义在主题中指定activity或app。
如何作为样式定义view和作为主题定义app稍后讨论。


继承
在<style>中的parent属性让你指定一个样式,可以让你的样式继承它的属性。
你可以使用这个属性继承已经存在的样式,仅仅定义你想改动或增加的属性。
你可以继承自己定义的样式或者是平台创建的。(参照使用平台样式和主题( Using Platform Styles and Themes),下面属性是继承自安卓平台)
例如,你可以继承安卓平台默认的文字外观然后修改它。
<style name="GreenText" parent="@android:style/TextAppearance">
        <item name="android:textColor">#00FF00</item>
    </style>

如果你想继承你自己定义的样式,你不必用“parent”属性。只要新样式的名称和你要继承的样式前缀名一样,用句号分割。
例如,在下面定义一个新样式继承自CodeFont,让颜色设置为红色,你可以创作新样式像这样:
   <style name="CodeFont.Red">
        <item name="android:textColor">#FF0000</item>
    </style>
注意在<style>中没有“parent”属性,但是因为名称属性以CodeFont样式名称开头(你已经创建的样式),新样式继承所有的样式属性。
新样式覆写了字体颜色属性让字体为红色。你可以引用新的样式@style/CodeFont.Red。

你可以按照你的想法继续继承,用句号连接名称。例如你可以用下面的样式继承CodeFont.Red从而变得更大。
   <style name="CodeFont.Red.Big">
        <item name="android:textSize">30sp</item>
    </style>
这个样式同时继承CodeFont和CodeFont.Red样式,然后增加android:textSize属性。
注意:这个用句号连接名称的继承技巧值限于定义你自己定义的资源。不能继承Android自带样式。引用一个自带样式例如TextAppearance,
你必须用“parent”属性。

样式属性
现在你知道了怎样定义一个样式,你需要学习什么种类的样式属性可以定义在<item>中。你也许已经熟悉了一些,像layout_width和textColor。
当然,有更多的属性你可以使用。

找到引用于一个指定view属性的最好地方是相应类的文档,名单中列出了所有支持的xml属性。
例如,在TextView XML属性表中列出的所有属性可以用在给TextView定义属性的样式中(或者子类)。
在文档中有一个属性是 android:inputType,所以你可以将android:inputType属性放在 <EditText>元素中,像这样:
<EditText
    android:inputType="number"
    ... />
你可以给EditText元素创建一个样式包括这个属性:
<style name="Numbers">
<item name="android:inputType">number</item>
...
</style>
所以你的XML布局可以实现这个样式:
<EditText
    style="@style/Numbers"
    ... />
这个简单的例子看起来要做很多工作,但是当你增加更多样式属性和因子并且在各个地方可以复用,收益是巨大的。

所有可以使用的样式属性,看R.attr文档。记住,所有的view对象都不能支持所有样式属性,所以你应该给view提供它支持的样式属性。
然而,如果view不支持它样式的所有属性,view将仅应用它支持的属性忽略其他。

一些样式属性,任何view元素都不支持只能用在主题中。这些样式属性用在整个界面而不是任何的view。
例如,可以隐藏app标题,隐藏状态条或者改变窗口背景的主题样式属性。这些样式属性不属于任何view对象。
要想知道这些只能用在主题的样式属性,看R.attr文档中以window开头的属性。
比如,windowNoTitle和windowBackground是当主题引用在activity和app才会起作用的样式属性。下一部分介绍在主题中引用样式。
注意:不要忘了在每个<item>属性加上前缀为android:的名称空间。例如:<item name="android:inputType">

二、在用户界面引用样式和主题

有两种设置样式的方式:
*给特定view,在布局文件中给view元素增加style属性
*或者给整个activity或者app,在安卓配置文件中给<activity>或者<application>元素增加 android:theme属性。

当你给布局中一个单独的view设置一个样式,样式中的属性只是给这个view用的。如果一个样式是用于viewgroup的,
子view不会继承样式属性--只有你指定的元素才会应用他的属性。不管怎样,你可以在主题中引用一个样式以便用于每个view元素。

要应用定义在主题中的样式,你必须在Android的配置文件中给activity或者app进行配置。
当你这么做了,每个在activity或app中的view将会应用他所支持的属性。例如,如果你在前面的例子中在activity中应用了CodeFont样式,
所有支持文本属性的view元素将应用这些属性。任何view不支持的属性将被忽略。如果一个view仅支持一些属性,那就仅应用这些属性。

给一个view应用样式
这里告诉你在XML布局中如何给view设置样式:
<TextView
    style="@style/CodeFont"
    android:text="@string/hello" />
现在这个TextView将根据CodeFont名称被设置样式。

给activity或app应用一个主题
给你的app的所有activity设置主题,打开配置文件(AndroidManifest.xml)编辑<application>标签用android:theme属性指定样式名称。
例如:
<application android:theme="@style/CustomTheme">
在你的app中如果你想将一个主题仅应用于一个activity,在<activity>标签中增加属性android:theme。
就像android提供的其他内置资源一样,为了避免自己写这些,有很多有预先定义的主题你可以使用。
例如,你可以用Dialog主题让你的activity像对话框:
<activity android:theme="@android:style/Theme.Dialog">
或者如果你想让背景变成透明的,用透明主题:
<activity android:theme="@android:style/Theme.Translucent">
如果你喜欢一个主题,当时想去调整他,只要在你的主题上把它作为parent属性。
例如,你可以修改经典亮色主题用你的颜色像这样:
<color name="custom_theme_color">#b0b0ff</color>
<style name="CustomTheme" parent="android:Theme.Light">
    <item name="android:windowBackground">@color/custom_theme_color</item>
    <item name="android:colorBackground">@color/custom_theme_color</item>
</style>
(注意这儿颜色作为一个特殊的资源需要提供因为android:windowBackground属性仅仅支持资源的引用而不能给一个颜色值,不像 android:colorBackground)

现在在安卓配置文件中用CustomTheme替代Theme.Light:
<activity android:theme="@style/CustomTheme">

根据平台版本选择主题
安卓最新版本增加了更多可以主题,你可以在新平台用这些并且兼容旧版本。
你可以基于平台通过选择不同的父主题资源来完成自定义主题。
例如,这儿是一个对标准平台默认light主题简化的自定义主题声明。可以放在一个res/values目录下的XML文件中(通常是res/values/styles.xml):
当app运行在android3.0或者更高版本时可以用新的全息主题,你可以在res/values-v11的XMl文件中放一个替换主题的可变声明,但是将父主题改为全息主题:
<style name="LightThemeSelector" parent="android:Theme.Holo.Light">
    ...
</style>
现在使用这个主题就像你使用其他任何主题,如果运行在android3.0或者更高版本你的app将会自动选择全息主题。

标准属性的列表你可以在R.styleable.Theme中找到并在主题中使用。

更多信息关于提供的可变资源,就像主题和布局,基于平台版本或者其他设备属性,参见提供资源(Providing Resources)文档。

三、使用平台样式和主题

安卓平台提供一个样式和主题的大集合,你可以在你app中使用。你可以在R.style类中找到所有可用的引用。
想使用主题列表,将下滑下替换为句号。例如,你可以用 Theme_NoTitleBar 主题像"@android:style/Theme.NoTitleBar”

R.style引用,没有很好的记录和透彻描述样式,所以查看这些样式实际的源码能给你更好的理解样式提供的每个属性。
关于安卓样式和主题更好的参考,看以下源码:
*Android Styles (styles.xml)
*Android Themes (themes.xml)

这些文件帮助你通过例子学习。例如,在安卓主题源码中,你将会找到一个声明<style name="Theme.Dialog">
在这个定义中,你将会看到安卓框架使用的对话框样式的所有属性。

更多关于在XML中样式和主题的语法,参看样式资源(Style Resource)文档。

你可以用可用样式属性的引用,来定义一个样式或者主题(比如"windowBackground" or "textAppearance"),参考R.attr或者相应的视图类来创建样式。
0 0