本文为Google官方译文,文中链接需要调整好上网姿势才能查看,原文地址:
Styles and Themes
https://developer.android.com/guide/topics/ui/themes.html
-
希望本文能帮助到有需要的小伙伴。
-
译文尽量使用原来的配方,力求还是原来的味道^-^
-
因水平有限,难免有错误之处,欢迎指正、吐槽。
译文开始
style 是指定 view 或 window 外观和格式的属性集合。它可以定义诸如 高度、间距、字体颜色、字体大小、背景色 等更多属性。style 被定义在与 layout 分开的 xml资源文件 中。
例如,通过使用 style,你可以使用如下的 layout 文件:
<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" />
所有和 style 相关的属性都被移除并被放入了名为 CodeFont 的 style 中,该 style 通过 style属性 进行了应用。稍后你将看到该 style 的定义。
theme 是应用于 整个Activity 或 application 的 style,而不是 单个View(如上面的例子)。当 style 被当成 theme 使用时,该 Activity 或 application 中的 每个View 将使用每一个它所支持的 style属性。例如:可以将相同的 CodeFont style 应用于一个 Activity,那么 Activity 中的 所有text 都会有 绿色的 monospace 字体。
定义Styles
要创建 style 集合,将一个 XML文件 保存在工程目录 res/values/ 下。XML文件 的名字可以随意,但它必须使用 xml扩展名 并保存在 res/values/文件夹。
XML文件 的 根节点 必须是<resources>
对于每个要创建的 style,添加一个 <style>节点,它的 name 唯一指定了该style(该属性是必须的)。然后为 style 的每个属性添加一个 <item>标签,它的 name 定义了属性,其后紧随一个 value(该属性是必须的)。<item> 的 value 可以是 字符串、十六进制颜色、另一个资源类型的引用 或者 其他依赖于style属性的value。下面的例子展示了只有单个 style 的文件:
该 <resources> 下的 每个子元素 在编译期将转化为应用资源对象,通过 <style> 中 name属性 的 value 可以引用它们。该 style 例子可以用 @style/CodeFont 在 XML布局 中引用(如上面的介绍)。
<style> 中的 parent属性 是可选的,它指定了该 style 应该继承属性的另一个style 资源ID。如果你想的话,可以 重写继承的style属性。
谨记,你想以 theme 形式用在 Activity 或 application 上的 style 和用在 View 上的 style 是完全一样在 XML 中定义的。一个 style,比方说上述的 style,能以 style的形式 用于 单个View 或以 theme的形式 用于 整个Activity或application。后续将讨论怎样将 style 用于 单个View上或者作为 applicaition theme。
继承
<style>中的 parent属性 可让你的 style 指定一个继承其属性的 style。你可以从 现有的style 继承属性,只定义那些你想修改或增加的属性。可以从 自己创建的styles 继承,也可以选择系统自带的(继承 系统自带style 的信息请看下面)。例如,你可以继承 Android 默认的 text appearance 并修改它:
如果你想继承 自己定义的style,可以不使用 parent属性。作为替代,仅仅将被继承的 style 的 name 作为 新style 的 name 的前缀。例如,要创建继承自上述 CodeFont 的 新style,但要使颜色变红,编辑如下的 新style:
<style name="CodeFont.Red"> <item name="android:textColor">#FF0000</item> </style>
注意,<style> 标签中没有 parent属性,因为 name属性 以 CodeFont 这个 style 的 name 开始(CodeFontstyle 已经被创建),这个 新style 继承了CodeFont 的所有属性。然后重写 android:textColor属性 将 text 变红。你可以用 @style/CodeFont.Red 来引用这一 新style。
通过点号将 names 链接,你可以随意地继续继承。例如,你可以继承 CodeFont.Red 使其成为 bigger,就像这样:
<style name="CodeFont.Red.Big"> <item name="android:textSize">30sp</item> </style>
这样就同时继承了CodeFont 和 CodeFont.Red 两个styles,然后增加了 android:textSize属性 。
注意: 通过 链接names 来继承这一技术 只适用于自己定义的styles,系统自带的styles 不支持这么做。要引用 系统自带的style,如 TextAppearance,必须使用 parent属性。
Style属性
既然你已经明白了 style 如何定义,你需要了解 <item>节点 可以定义哪些 style属性。有些可能你已经知道,如 layout_width 和 textColor。当然,你可以使用更多的 style属性。
寻找 特定 View 属性 的最佳之处就是对应的类参考,那儿列出了所有支持的 XML属性。例如,所有列在 TextView 的 XML attributes表格 中的属性可用于定义 TextView style(或其子类)。参考中有一个属性 android:inputType,所以你可以将其放入一个 <EditText>节点,就像这样:
<EditText android:inputType="number" ... />
作为替代,你可以为 EditText 新建一个包含这个属性的 style:
<style name="Numbers"> <item name="android:inputType">number</item> ... </style>
然后布局文件就可以实现这一 style:
<EditText style="@style/Numbers" ... />
这个简单的例子看起来意味着更多的工作,但当你增加更多的属性并将这个 style 复用在多处时,回报将是巨大的。
所有可用 style属性 的参考,可以查看 R.attr。记住,不是所有的View 对象都接受 相同的style属性,所以一般应参考 特定View支持的属性。但是,如果一个 View 不支持应用于其上 style 中的所有属性,那这个 View 只会应用那些它支持的属性,其它的属性会被自动忽略。
有些 style属性 是 所有View元素 都不支持的,只能当作 theme 使用。这些 style属性 应用于 整个window 而非任一种View。如用于 theme 的 style属性:隐藏标题栏、隐藏状态栏、改变window背景色。这些 style属性 不属于任一 View 对象。要知道这些 theme 专用的 style属性,查看 R.attr 中那些 以window开头的属性。例如:windowNoTitle 和 windowBackground 是只在 style 当做 theme 用于 Activity 或 application 时才起作用的style属性。下一节介绍将 style 用作 theme。
注意 :别忘了在 每个<item>元素 中对属性名加上 android:命名空间 这个前缀。例如:
<item name="android:inputType">
将Styles和Themes应用于UI
有两种设置 style 的方法:
-
对于 单个View,通过在 布局XML文件 中的 View节点 上增加 style属性。
-
或者,对于 整个Activity 或 application,通过在 Android manifest 的 <activity> 或 <application> 节点上增加 android:theme属性。
当你在布局中对 单个View 应用 style,该 style 中定义的属性只用于该 View。如果 style 被用于一个 ViewGroup,子View 不会继承这些 style属性,只有你直接应用 style 的节点会发生作用。但是,你可以将 style 用作 theme,这样就能作用于 所有View节点。
为了将 style 用作 theme,你必须在 Android manifest 中将该 style 应用于一个 Activity 或 application。这么做之后,该 Activity 或 application 中的 每个View 都会应用它所支持的属性。
例如,如果将之前例子中的 CodeFont style 用于一个 Activity,那所有支持该 text style属性 的 View节点 都会应用这些属性。不支持这些属性的 View 则会忽略这些属性。如果一个 View 只支持其中的部分属性,那它只会应用那些属性。
将style用于View
下面展示了如何在布局中将 style 用于一个 View:
<TextView style="@style/CodeFont" android:text="@string/hello" />
现在这个 TextView 会应用名为 CodeFont 的 style。(见上面 定义属性 中的例子)
注意:style属性 不需要 android:命名空间 这一前缀。
将theme用于Activity或application
要将一个 theme 用在应用的 所有activities 中,打开 AndroidManifest.xml 文件并在 <application>标签 中加入指定 style 名的 android:theme属性。例如:
<application android:theme="@style/CustomTheme">
如果你只想在一个 Activity 中应用 theme,就在相应的 <activity>标签 中增加 android:theme属性。
正如Android提供了其他自带资源,你也可以使用许多 自带的themes,而不用自己写。例如,你可以使用 Dialog theme 使你的 Activity 像一个 dialog box:
<activity android:theme="@android:style/Theme.Dialog">
或者,你想让背景透明,可以使用 Translucent theme:
<activity android:theme="@android:style/Theme.Translucent">
如果你喜欢一个 theme,但想改变它,只需将该 theme 添加为你定制 theme 的 parent。例如,你可以改变传统的 light theme 以使用自己的颜色,就像这样:
现在可以在 Android Manifest 中使用 CustomTheme 代替 Theme.Light 了:
<activity android:theme="@style/CustomTheme">
根据系统版本选择theme
较新的Android版本上有 额外的themes,你可能想在这些较新的系统上使用这些 themes,同时兼容旧系统。要做到这一点,你可以定制一个 theme,它能根据系统版本使用资源选择来切换不同 parent themes。
例如,这里有一个 定制theme 的声明,它很简单,只是标准系统中的默认 light theme。它将出现在 res/values 下的XML文件中( 通常是 res/values/styles.xml):
<style name="LightThemeSelector" parent="android:Theme.Light"> ... </style>
当运行在 Android 3.0(API Level 11)或更高版本上时,如果想让这个 theme使用较新的 holographic theme,可以在 res/values-v11 下的XML文件中放置该 theme 的一个替代声明,它要使用 holographic theme 作为 parent theme:
<style name="LightThemeSelector" parent="android:Theme.Holo.Light"> ... </style>
现在像别的 theme 一样使用它,当运行在 Android 3.0 或 更高版本 上时,应用会自动切换到 holographic theme。
你可以在 R.styleable.Theme 找到能用在 themes 中的标准属性清单。
更多关于提供可选资源 的信息,例如基于系统版本或其他设备配置的 themes 和 layouts,请查看 Providing Resources 文档。
使用系统Styles和Themes
Android系统提供了大量你可应用的 styles 和 themes。你可以在 R.style 类中找到所有可用styles的参考。要使用其中的 styles,用点号替代 style名称 中的下划线。例如,可以用 "@android:style/Theme.NoTitleBar" 来使用 Theme_NoTitleBartheme。
但是,R.style 没有很好地文档化,也没有充分地描述这些 styles,所以查看这些 styles 和 themes 的真实源码会对它们能提供的 style属性 有更好的理解。需要 Android styles and themes 的更棒的参考,请查看下面的源码:
-
Android Styles (styles.xml)
-
Android Themes (themes.xml)
这些文档可以通过示例来帮助你学习。例如,在 Android themes 源码中,你可以看到 <style name="Theme.Dialog"> 的声明。在这个声明中,你能找到被系统用来形成 dialogs 的所有属性。
更多关于XML文件中 styles and themes 语法的信息,请查看 Style Resource 文档。
要查看那些你能用于 定义style 或 theme 的 style属性(如 "windowBackground" 或 "textAppearance"),请查看 R.attr 或你正为其创建 style 的各自 View 类。