第11章 样式和主题

style是用于指定View或window的外观和格式的一系列属性的集合。style可以指定高(height)、填补(padding)、字体颜色、字体大小、背景颜色等等属性。style定义在不同于用来设置布局的XML资源中。Android中的Syles与网页设计中的层叠样式表有着相似的原理——允许你将设计从内容中分离出来。例如,使用一个style,你可以将下面这个布局:

<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相关的属性从XML布局中移出,放到一个名为CodeFont 的style定义中,通过style属性应用。你将在以下章节中看到此类style的定义。theme是一个应用于整个Activity或应用中,而不是某一个单独的View(正如上面的例子)。当一个style被作为theme来应用时,Activity或应用中的每个View都将应用支持的每个style属性。例如,你能把CodeFont style作为theme应用于一个Activity,那么这个Activity中所有文本都将是绿色等宽字体。

11.1 定义样式

创建一套style,需保存一个XML文件到你的工程的res/values/ 目录下。这个XML文件的名称可以随便定义,但必须使用.xml作为后缀,且要保存在res/values/ 文件夹中。这个XML文件的根节点必须是<resources> 。为每个要创建的style,添加一个用来唯一标识此style的name的<style> 元素到文件中(这个属性是必需的)。然后为style的每个属性添加一个<item> 元素,其包含一个声明style属性的name 和一个使用的值(这个属性是必需的)。这个<item> 的值可以是一个关键字符串、十六进制颜色、到另一个资源类型的引用或其他值,取决于style的属性。这里有一个单独style的例子,如代码清单11-1所示:

<?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>

代码清单11-1

每个<resources> 节点的子节点在编译时都被转换为一个应用程序资源对象,其可通过<style> 元素的name 属性的值来引用。这个示例中style可以通过@style/CodeFont在一个XML布局中引用。在<style>节点中的parent 属性是可选的,用来指定另一个style资源的ID,前者继承后者的所有属性。你可以复写继承的style属性,如果你想要那样做。记住,你想要用作一个Activity或应用theme的style,与在XML中定义一个View的style方法是一样的。一个如同上面那样定义的style可以应用于一个View的style,或是整个Activity或应用的theme。稍后讨论如何将一个style应用于一个View或一个应用theme中。

11.1.1继承

<style> 元素的parent 属性让你能够从指定的style中继承属性。你可以通过这种途径从一个现有的style中继承属性,然后定义你想改变或添加的属性。你可以从你自己创建的style或平台内创建的style中继承。例如,你可以继承Android平台默认文本外观并修改,如代码清单11-2所示:

  <style name="GreenText" parent="@android:style/TextAppearance">
<item name="android:textColor">#00FF00</item>
</style>

代码清单11-2

如果你想要继承你自己定义的style,你不必使用parent 属性,而是将你想通过继承创建的新style的name前加上要继承的style的name,使用一个句点。例如,创建一个继承前面定义的CodeFont 的style,把颜色改为红色,你可以像这样编写新的style,如代码清单11-3所示:

    <style name="CodeFont.Red">
<item name="android:textColor">#FF0000</item>
</style>

代码清单11-3

注意在<style> 标签中没有parent 属性,因为name 属性以CodeFont 起始(你已经创建的style),这个style继承所有style属性。这个style复写android:textColor 属性将文本设置为红色。你可以通过@style/CodeFont.Red 引用这个新style。你可以像这样继续继承很多次,只要修改句点之前的名称。例如,你可以扩展CodeFont.Red 使字体变大,如代码清单11-4所示:

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

代码清单11-4

从CodeFont 和CodeFont.Red style中同时继承,然后添加android:textSize 属性。注意: 这种技巧仅适用于将你自己定义的资源链接起来。你不能用这种方式继承Android内建的style。要引用一个诸如TextAppearance的内建style,你必须使用parent 属性。

11.1.2样式属性

到目前,你已明白了一个style是如何定义的,你需要学习由<item> 元素定义的哪些属性是可用的。你很可能已经熟悉了某些,比如layout_width和textColor。当然,有更多的style属性供你使用。
找到适用于某个特定View的属性的最佳方法是相应的类的参考,其中列出了所有支持的XML属性。例如,TextView其中列出的一个属性是android:inputType,那么你通常可能将android:inputType属性放置在<EditText> 元素中,如代码清单11-5所示:

<EditText
android:inputType="number"
... />

代码清单11-5

你也可以为包含这个属性的EditText元素创建一个style,如代码清单11-6所示:

<style name="Numbers">
<item name="android:inputType">number</item>
...
</style>

代码清单11-6

所以你的布局XML现在可以这样实现这个style,如代码清单11-7所示:

<EditText
style="@style/Numbers"
... />

代码清单11-6

这个简单的例子看起来增加了工作量,但当你添加越来越多的style属性并考虑到此style在不同地方的可重用性时,你会发现获益是巨大的。关于所有可用的style属性,请参见R.attr(http://developer.android.com/reference/android/R.attr.html)。记住所有的View对象并不接受相同的style属性,所以你通常应该参考特定的View类,查看其所支持的style属性。但是,如果你对一个View应用了style,而其并不支持此style中某些属性,那么此View将应用那些它支持的属性,并简单忽略那些不支持的。然而一些style属性只能被当作一个theme来应用,而不支持任何View元素。这些style属性应用到整个窗口,而不是任何类型的View。例如那些用于隐藏应用标题、隐藏状态栏或改变窗口背景的style属性。这些style属性不属于任何View对象。探究这些仅应用于theme的style属性,参见R.attr中那些以window 开头的属性。举个例子,windowNoTitle 和windowBackground 是仅当style作为theme应用于一个Activity或应用时才有效的style属性。参阅下一节,获得关于style应用作theme的信息。注意:不要忘记对每个<item> 元素中的属性冠以android: 命名空间前缀。例如:<item name="android:inputType">。

11.2 应用样式和主题到UI中

有两种方式来设置style:

◆对一个独立的View,添加style 属性到你的布局XML中的View元素中。

◆或者,对一个Activity或应用添加android:theme 属性到Android manifest的<activity> 或<application> 元素中。

当你应用一个style到布局中一个单独的View上,此style定义的属性会仅应用于那个View。如果一个style应用到一个ViewGroup上,那么子View元素并不会继承应用此style属性——只有你直接应用了style的元素才会应用其属性。然而,你可以通过将其作为theme来应用的方式应用一个style到所有View元素上。将一个style作为一个theme来应用,你必须在Android manifest中将其应用到一个Activity或应用中。当你这样做,此Activity或应用中的每个View都将应用其所支持的属性。例如,如果你应用前面示例中的CodeFont style到一个Activity,那么支持此文本style属性的所有View元素都将应用它们。所有View所不支持的属性都会被忽略。如果一个View仅支持某些属性,那么它就只应用那些属性。

11.2.1应用样式到一个View

下面是如何在XML布局中为View设置style的方法,如代码清单11-7所示:

<TextView
style="@style/CodeFont"
android:text="@string/hello" />

代码清单11-7

现在这个TextView将应用名为CodeFont 的style所定义的属性。注意:style属性不能使用android: 命名空间前缀。

11.2.2应用主题到一个Activity或应用程序中

对你的应用程序中所有activity设置一个theme,打开AndroidManifest.xml 文件并编辑<application> 标签,使之包含android:theme 属性和style名称。如代码清单11-8所示:

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

代码清单11-8

如果你希望theme仅应用到你的应用程序中的某个Activity中,那么就将android:theme 属性添加到<activity> 标签里。正如Android提供的其他内建资源一样,有许多你可以使用的预定义theme,而不用自己编写它们。例如,你可以使用Dialog theme使你的Activity看起来像一个对话框,如代码清单11-9所示:

<activity android:theme="@android:style/Theme.Dialog">

代码清单11-9

或者你想让背景变成透明的,那就使用透明theme,如代码清单11-10所示:

<activity android:theme="@android:style/Theme.Translucent">

代码清单11-10

如果你喜欢一个theme,但又想调整它,那么你可以将其作为你的自定义theme的parent 。例如,你可以像这样修改传统的light theme来使用你自己定义的颜色,如代码清单11-11所示:

<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>

代码清单11-11

(注意,这里颜色需要作为单独的资源提供,因为android:windowBackground 属性只支持到另一个资源的引用,不像android:colorBackground ,它不能得到一种文本颜色。)现在在Android Manifest中使用CustomTheme 代替Theme.Light,如代码清单11-12所示:

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

代码清单11-12

11.2.3 根据平台版本选择一个主题

新版本的Android应用程序提供额外的theme,你可能想使用它们在这些平台上运行,同时与旧版本兼容。你可以通过使用自定义theme资源选择不同的parent theme,根据平台版本之间切换完成。例如,这里声明一个自定义theme,相当于是标准平台上默认的light theme。它将在XML文件的res/values 目录下(通常是res/values/styles.xml),如代码清单11-13所示:

<style name="LightThemeSelector" parent="android:Theme.Light">
...
</style>

代码清单11-13

当程序运行在Android3.0(API等级11)或更高的版本时使用新的holographic theme,你可以在res/values-v11 的XML文件中放置另一个声明theme,但holographic theme的parent theme像这样设置,如代码清单11-14所示:

<style name="LightThemeSelector" parent="android:Theme.Holo.Light">
...
</style>

代码清单11-14

现在可以如其他的theme那样使用这个theme,如果你的应用程序运行在Android3.0或更高的版本时,将自动切换到holographic theme。你可以在R.styleable.Theme中找到你能够使用的theme的标准属性列表。

11.3 使用平台的样式和主题

Android平台提供了大量的style和theme供你在应用程序中使用。你可以在R.style类中找到所有可用的style。要使用这些style,用句点替换style名称中的下划线。例如,你可以通过"@android:style/Theme.NoTitleBar"应用Theme.NoTitleBar的主题。然而,R.style没有好的文档,没有详细叙述这些style,所以查看这些style和theme的实际源代码将使你更好理解每个style属性提供了什么功能。这些文件将通过例子帮助你学习。举个例子,在Android theme源代码中,你将会找到一个<style name="Theme.Dialog">声明。在这个定义中,你将看到所有由Android框架使用的用于对话框的style属性。关于你可以用来定义style或theme的可用style属性(例如,"windowBackground" 或 "textAppearance"),参阅R.attr或者对应于你正在为其创建一个style的View类。

本文来自jy02432443,是本人辛辛苦苦一个个字码出来的,转载请保留出处,并保留追究法律责任的权利 QQ78117253 

第三部分:Android 应用程序接口指南---第二节:UI---第十一章 样式和主题的更多相关文章

  1. 第三部分:Android 应用程序接口指南---第二节:UI---第一章 用户界面和布局

    第1章 用户界面和布局 应用程序的用户界面就是用户能看到并可以与它交互的任何东西.Android提供多种预置的UI组件,如结构化布局对象和允许你为应用程序创建图形用户界面的UI控件.Android也会 ...

  2. 第三部分:Android 应用程序接口指南---第二节:UI---第四章 Action Bar

    第4章 Action Bar Action Bar是一个能用于确定应用程序和用户的位置,并提供给用户操作和导航模式的窗口功能.如果需要显著地展示当前用户的操作或导航,应该使用Action Bar,因为 ...

  3. 第三部分:Android 应用程序接口指南---第二节:UI---第二章 输入控件

    第2章 输入控件 输入控件是应用程序中用户接口的一种交互式组件.Android提供了大量的可供人们在UI中使用的控件,比如按钮.文本区域.(带滑块的)进度条.复选框.缩放按钮以及切换按钮等等. 在UI ...

  4. 第三部分:Android 应用程序接口指南---第二节:UI---第五章 设置(Settings)

    第5章 设置(Settings) 应用程序通常包括允许用户修改应用程序的特性和行为的设置功能.例如,一些应用程序允许用户指定通知是否启用或指定多久使用云同步数据.如果你想要为你的应用程序提供设置,你应 ...

  5. 第三部分:Android 应用程序接口指南---第二节:UI---第六章 对话框

    第6章 对话框 一个对话框是一个小窗口,提示用户做出决定或输入额外的信息,一个对话框不填充屏幕并且通常用于在程序运行时中断,然后弹出通知提示用户,从而直接影响到正在运行的程序.图6-1就是对话框的外观 ...

  6. 第三部分:Android 应用程序接口指南---第二节:UI---第九章 搜索

    第9章 搜索 在android平台上搜索是一个核心的用户功能.无论内容位于设备或网络上,用户应该能够搜索任何对它们可用的数据.为了创建一个一致的用户搜索体验,Android平台提供了一个搜索框架帮助你 ...

  7. 第三部分:Android 应用程序接口指南---第二节:UI---第七章 通知

    第7章 通知 一个通知是一条消息他是显示于你应用程序之外的一个界面中.当你告诉系统要发布一个通知时,它首先作为一个icon出现在通知区域.为了看见通知的细节,用户可以点击通知区域展开一个新的界面.下面 ...

  8. 第三部分:Android 应用程序接口指南---第二节:UI---第三章 菜单

    第3章 菜单 在许多不同类型的应用中,菜单通常是一种用户界面组件.为了提供给用户提供熟悉且一致的体验,你需要使用菜单API来展示用户动作和你Activity中的其他选项. 从安卓3.0系统(API l ...

  9. 第三部分:Android 应用程序接口指南---第二节:UI---第八章 Toast通知

    第8章 Toast通知 Toast通知是在窗口前面弹出的信息.它只占有信息所需要的空间量,并且用户当前的activity仍然是可见的.可互动的.这种通知自动地淡入和淡出,它不接受交互事件.他相当于一种 ...

随机推荐

  1. 2018年商业版idea破解安装介绍

    1. IntelliJ IDEA 2018商业版-安装 首先去官网http://www.jetbrains.com/idea/download/#section=windows下载Ultimate版( ...

  2. 《Gradle权威指南》--Gradle构建脚本基础

    No1: 设置文件默认名是setting.gradle,放在根目录下,大多数作用都是为了配置子工程 No2: 一个Project包含很多个Task.Task就是一个操作,一个原子性的操作.其实它是Pr ...

  3. 编辑你的数学公式——markdown中latex的使用

    前言 最近开始使用起markdown来记学习笔记,因为经常有公式要写,就需要用到latex,到网上查来查去又不太方便,而且也很少能查到写的比较全的,就准备写下这篇文章. 插入数学公式 在markdow ...

  4. canvas学习-----画直线

    画布 1.添加canvas标签  可以通过CSS或者JS来设置canvs标签的width,height;Ps: <canvas id="cvs"></canvas ...

  5. manjaro 配置 独立显卡驱动

    参考 https://blog.csdn.net/weixin_42205310/article/details/81905293 尝试多次 只有这篇配置成功. ①先解决依赖sudo pacman - ...

  6. hihoCoder.1513.小Hi的烦恼(bitset 五维偏序)

    题目链接 五维偏序,对每一维维护bitset,表示哪儿为1(比它大),然后5个bitset与起来就能得到答案了. 具体实现可以用5*n个bitset,按排名搞个前缀和. 复杂度\(O(n^2/w)\) ...

  7. 探究functools模块wraps装饰器的用途

    <A Byte of Python>17.8节讲decorator的时候,用到了functools模块中的一个装饰器:wraps.因为之前没有接触过这个装饰器,所以特地研究了一下. 何谓“ ...

  8. java计算某个坐标是否在范围内

    java电子围栏 圆.矩形.多边形算法 http://blog.csdn.net/deepak192/article/details/79402694/ java-经纬度有关的计算(半径内的经纬度范围 ...

  9. U3D面试题四

    1.配置Unity3D调试环境 在windows环境下,设置unity3d的编辑器调试环境方法: 点击“Edit‘---”Preferences“,弹出如下窗口 选择MonoDeveop即可. 在编辑 ...

  10. UITableView滚动优化(RunLoop)

    链接: 利用RunLoop优化tableView RunLoop方式优化加载tableview RunLoop总结:RunLoop的应用场景(三)滚动视图流畅性优化 TableView加载图片的优化逻 ...