Android Styles与Themes使用攻略

本文为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 的文件:

 

212342_YziM_1771562.gif

 

该 <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 并修改它:

 

212342_HUJR_1771562.gif

如果你想继承 自己定义的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 以使用自己的颜色,就像这样:

 

212342_acm9_1771562.gif

 

现在可以在 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 类。

转载于:https://my.oschina.net/JiangTun/blog/914265

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值