Android API 指南 - 【样式Style与主题Theme】

原文:http://developer.android.com/intl/zh-cn/guide/topics/ui/themes.html


样式(style)是定义了一个View或Window的外观和格式的属性的集合。样式可以定义的属性包括高度(height)、填充值(padding)、字体颜色、字体大小、背景颜色等等。定义样式的XML文件与布局文件是独立开来的。

样式与Web设计中的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" />
所有与样式相关的属性都从布局文件中被移除,并被放置在一个名为CodeFont的样式定义中,这个样式通过style属性被应用与布局上。这个样式的定义内容会出现在下文中。

主题(theme)是应用于活动(Activity)或者整个程序的样式,而不仅仅是单一的View。当一个样式以主题的形式被使用,Activity或者程序中的每一个View都会使用其可以使用的在样式中定义的属性。比如,你可以让CodeFont成为Activity的主题,这个Activity内所有的文本都会采用绿色等宽字体。


定义样式

要创建样式,首先需要在项目的res/values目录下新建一个XML文件,XML文件的名字可以是任意的,但必须使用.xml后缀并且位于res/values目录下。

XML文件的根节点必须是<resources>。

每创建一个样式,需要增加一个<style>节点且必须带有一个name属性来唯一标识这个样式。然后为样式的每一个属性增加一个<item>,每个<item>也必须含有声明了是哪个样式属性的name以及对应的值(name和值必须要写)。<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中定义的名称来使用这个样式。上述例子中的样式可以在布局文件中通过@style/CodeFont被引用。

<style>中的parent属性是可选的,它的值是其他样式的资源id,表示当前样式会继承其他样式的属性。如果需要,你可以重写继承的样式的内容。

需要记住的是,定义一个Activity或者程序的主题与定义一个View的样式是完全一样的。像上面那样定义的样式既可以被用作View的样式也可以被用作主题。样式和主题的使用会在后面介绍。


继承

<style>的parent属性允许当前样式继承其他样式属性。你可以通过这种方式来继承一个现有的样式,只需定义你希望修改或增加的属性。不论是用户自定义的样式还是平台自带的系统样式都可以被继承。例如,你可以继承安卓平台默认的文本外观并修改它:

<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属性,但是由于name属性的值由CodeFont样式名开头,这个新样式就继承了CodeFont的所有属性。新样式重写了android:textColor属性使文字变为红色。你可以通过@style/CodeFont.Red来引用这个新样式。
通过点号分割,可以实现任意层次的“嵌套继承”,例如可以继承CodeFont.Red,如下:

<style name="CodeFont.Red.Big">
        <item name="android:textSize">30sp</item>
</style>
这个样式继承了Code.Font以及Code.Font.Red的属性,然后增加了androidLtextSize属性。

注意:这种通过名称前缀实现继承的方式只适用于自定义的样式,系统样式是不能这样做的。如果想要继承系统样式,例如TextAppearance必须使用parent属性。


样式属性

前面已经介绍了怎样定义一个样式,现在要说明的是什么样的通过<item>定义的样式属性是有效的。大家对于一些例如layout_width、textColor等属性已经很熟悉了,当然,可用的属性远不止这些。

找出一个特定View的属性的最好办法是查看相应类的API文档,其中列出了所有支持的XML属性。例如,TextView XML attributes中列出的所有属性都可以用于TextView(或者其子类)的样式定义。从API文档中可以看到android:inoutType是可用属性,很多时候大家会将其作为EditText的属性:

<EditText
    android:inputType="number"
... />
<pre name="code" class="html">我们可以创建一个针对EditText的样式,其中包含了这个属性:
<pre name="code" class="html"><style name="Numbers">
  <item name="android:inputType">number</item>
  ...
</style>
然后在布局文件中实现这个样式:
 
 

<EditText
    style="@style/Numbers"
... />
这个简单的例子看起来似乎增加了工作量,但当你添加更多的样式属性并且在不同的地方重用这些样式时,效率的提升就显而易见了。

R.attr的API文档中列出了所有可用的样式属性。务必记住并非所有的View对象都接受任意一个样式属性,所以在通常情况下,你都应该具体的View支持的样式属性。当然,如果真的将含有不支持属性的样式应用在某个View上也不会产生什么严重后果,这个View只会采用那些支持的属性同时忽略那些不支持的。

还存在一些样式属性,没有View是支持的,只能应用在主题上。这些样式属性面向整个窗体而非某个View,例如,面向主题的样式属性可以隐藏程序标题、隐藏状态栏或者改变窗体的背景颜色。此类属性不属于任何View,通过查看R.attr文档中以window开头的属性可以找到它们。例如,windowNoTitle与windowBackground只有在用于Activity或者程序的主题中才有效。

注意:不要忘记没个<item>的属性名前都应带有android:命名空间,例如:<item name="android:inputType">。


将样式或主题应用到UI

有两种方式应用样式:

    1. 对于独立的View,在布局文件中添加style属性。

    2. 对于整个Activity或者程序,在Android Manifest的<activity>或者<application>下添加android:theme属性。

对于单个View,样式也仅会作用在这个View上。如果是ViewGroup,其子View不会应用父View的样式,只有明确写了style属性的父View才会应用样式。如果想让所有的View都应用样式,应该选择使用主题。

如果想将一个样式用作主题,必须在Android Manifest里将其应用在Activity或者Application上。这么做以后 ,Activity或者程序中的每一个View都会应用其支持的样式属性。例如,如果将上文中的CodeFont样式用在一个Activity上,Activity内所有支持文字样式属性的View都会有效果,而那些不支持文字样式属性的View不会发生变化。如果一个View只支持部分属性,那它就只应用那部分属性。

·应用一个样式到View

下面的代码展示了如何在布局文件中应用一个样式到View上:

<TextView
    style="@style/CodeFont"
    android:text="@string/hello" />
注意:style属性上不要写android:这个命名空间前缀。

·应用一个主题到Activity或者Application

如果想为程序中所有Activity设置主题,打开AndroidManifest.xml,编辑<application>标签,加入android:theme属性并制定样式名称,比如:

<application android:theme="@style/CustomTheme">
如果只想对一个Activity指定主题,在<activity>标签下添加android:theme即可。

Andriod提供了许多内置的预定义主题,避免了开发者自己编写的麻烦。比如,使用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:windowBackgroud只支持对其他资源的引用,这点与android:colorBackgroud可以使用颜色码有较大差异)

现在,就可以在Android Manifest中使用新的主题CustomTheme了:

<activity android:theme="@style/CustomTheme">

·根据平台版本(SDK)选择主题

更高版本的Android往往支持更多的主题,你或许希望在高版本Android上使用这些新主题,而在老版本的Android上仍能兼容。我们可以通过创建自定义主题,然后根据平台版本不同选择不同的parent主题来解决这个问题。

举例来说,下面是一个自定义主题的声明,继承了内置的LightTheme。其所在XML文件位于res/values中(通常是res/values/styles.xml)。

<style name="LightThemeSelector" parent="android:Theme.Light">
    ...
</style>
为了让这个主题在Android 3.0以上版本的平台能够继承更新的holo主题,你可以在res/values-v11目录下放置一个“备选的”XML主题文件:

<style name="LightThemeSelector" parent="android:Theme.Holo.Light">
    ...
</style>
其他情况类似。这样做以后,程序就会根据版本来自动选择对应的主题了。

在R.style.Theme文档中可以找到与主题相关的标准属性的列表。


使用平台样式与主题

Android平台提供了大量可用样式和主题,我们可在R.style的文档中可以找到它们。使用这些样式或主题时,以点号代替文档中的下划线。例如,使用Theme_NoTitleBar的使用方法是“@android:style/Theme.NoTitleBar”。

R.style文档并没有对样式进行完善的描述和归纳,所以要想更好了解每个样式究竟是什么样子,最好是查看描述各个样式的源代码:

    · Android样式(styles.xml)

    · Android主题(themes.xml)

举例来说,在上述文件中你可以找到<style name="Theme.Dialog">的定义,在这里可以看到系统对话框采用的所有样式属性。

样式资源 文档中会对样式XML的语法做更详细的介绍。



【手工翻译,没有100%翻译,尽量保证意思准确】

【如有错误,欢迎指正】

【欢迎转载,请务必注明原文和译文地址】


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值