第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属性。例如,你能把CodeFontstyle作为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.Redstyle中同时继承,然后添加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都将应用其所支持的属性。例如,如果你应用前面示例中的CodeFontstyle到一个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,而不用自己编写它们。例如,你可以使用Dialogtheme使你的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

更多相关文章

  1. 没有一行代码,「2020 新冠肺炎记忆」这个项目却登上了 GitHub 中
  2. Git下载android framework源代码
  3. Android导入源文件没有自生成R.java和关于"@color"
  4. Android(安卓)Studio代码自动检测错误提示
  5. Android新浪微博开发(五)android中的selector,背景选择器
  6. MVC模式
  7. Android(安卓)WebView和JS交互详细教程
  8. 【Android注释技巧】Android函数上面的注释你是怎么写的?(Eclipse
  9. android实现蓝牙文件发送的实例代码,支持多种机型

随机推荐

  1. Android(安卓)设备上实现串口的移植
  2. Android文件存储
  3. 浅入浅出 Android(安卓)安全 (二) Android(
  4. 基于AOA协议的android USB通信
  5. Android开发者必知的开发资源
  6. Android新手入门 FAQ
  7. Android读写XML(中)――SAX
  8. Unity的春天
  9. 代码实现Android流量统计
  10. Android开发4:电话拨号器