Android Styles and Themes

样式

样式是指能够为View窗口指定外观和格式的属性集合。样式能够指定高度、填充、字体颜色、字号、背景色等许多属性。 样式是在与指定布局的XML文件不一样的XML资源中进行定义。android

主题

主题是对整个Activity应用而不是对单个View应用的样式。以主题形式应用样式时,Activity或者应用中的每一个视图都将应用其支持的每一个样式属性。bash

定义样式

要建立一组样式,请在您的项目的 res/values/ 目录中保存一个 XML 文件。 可任意指定该 XML 文件的名称,但它必须使用 .xml 扩展名,而且必须保存在 res/values/ 文件夹内。app

该 XML 文件的根节点必须是 <resources>布局

对于您想建立的每一个样式,向该文件添加一个 <style> 元素,该元素带有对样式进行惟一标识的 name 属性(该属性为必需属性)。而后为该样式的每一个属性添加一个 <item> 元素,该元素带有声明样式属性以及属性值的 name(该属性为必需属性)。 根据样式属性,<item> 的值能够是关键字字符串、十六进制颜色值、对另外一资源类型的引用或其余值。如下是一个包含单个样式的示例文件:字体

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <style name="CodeFont" parent="@android:style/TextAppearance.Medium">
        <item name="android:layout_width">match_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 属性中的值引用。 可从 XML 布局以 @style/CodeFont 形式引用该示例样式。spa

<style> 元素中的 parent 属性是可选属性,它指定应做为此样式所继承属性来源的另外一样式的资源 ID。 若是愿意,您可在随后替换这些继承的样式属性。code

注意,在 XML 中定义您想用做Activity应用主题的样式与定义视图样式的方法彻底相同。诸如上文所定义的样式既能够做为单个视图的样式加以应用,也可做为整个 Activity应用的主题加以应用。xml

样式继承

经过 <style> 元素中的 parent 属性指定应做为您的样式所继承属性来源的样式。您能够利用它来继承现有样式的属性,而后只定义您想要更改或添加的属性。 您能够从自行建立的样式或平台内建的样式继承属性。对象

例如,您能够继承 Android 平台的默认文本外观,而后对其进行修改:继承

<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 样式名称(这是您建立的一个样式)开头,所以这个样式会继承该样式的全部样式属性。 这个样式随后会替换 android:textColor 属性,将文本设置为红色。 您能够 @style/CodeFont.Red 形式引用这个新样式。

您能够经过使用句点连接名称继续进行这样的继承,次数不限。 例如,您能够经过如下代码将 CodeFont.Red 扩大:

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

这段代码同时从CodeFontCodeFont.Red样式继承,而后添加android:textSize属性。

注:这种经过将名称连接起来的继承方法只适用于由您本身的资源定义的样式。 您没法经过这种方法继承 Android 内建样式。 要引用内建样式(例如 TextAppearance),您必须使用 parent 属性。

对 UI 应用样式和主题

设置样式的方法有两种:

  • 若是是对单个视图应用样式,请为布局 XML 中的 View 元素添加 style 属性。
    <TextView
    style="@style/CodeFont"
    android:text="@string/hello" />
    复制代码
  • 或者,若是是对整个 Activity 或应用来应用样式,请为 Android 清单中的 或 元素添加 android:theme 属性。
    <application android:theme="@style/CustomTheme">
    
    <activity android:theme="@android:style/Theme.Dialog">
    复制代码

当您对布局中的单个View应用样式时,该样式定义的属性只应用于该 View。 若是对ViewGroup应用样式,子View元素将不会继承样式属性只有被您直接应用样式的元素才会应用其属性。 不过,您能够经过以主题形式应用样式,使所应用的样式做用于全部 View 元素。

要以主题形式应用样式定义,您必须在 Android 清单中将样式应用于 Activity 或应用。 若是您这样作,Activity 或应用内的每一个 View 都将应用其支持的每一个属性。 例如,若是您对某个 Activity 应用前面示例中的 CodeFont 样式,则全部支持这些文本样式属性的 View 元素也会应用这些属性。 任何不支持这些属性的 View 都会忽略这些属性。 若是某个 View 仅支持部分属性,将只应用这些属性。

根据平台版本选择主题

新版本的 Android 可为应用提供更多主题,您可能但愿在这些平台上运行时能够使用这些新增主题,同时仍可兼容旧版本。 您能够经过自定义主题来实现这一目的,该主题根据平台版本利用资源选择在不一样父主题之间切换。

例如,如下这个声明所对应的自定义主题就是标准的平台默认明亮主题。 它位于 res/values 之下的一个 XML 文件(一般是 res/values/styles.xml)中:

<style name="LightThemeSelector" parent="android:Theme.Light">
    ...
</style>
复制代码

为了让该主题在应用运行在 Android 3.0(API 级别 11)或更高版本系统上时使用更新的全息主题,您能够在 res/values-v11 下的 XML 文件中加入一个替代主题声明,但将父主题设置为全息主题:

<style name="LightThemeSelector" parent="android:Theme.Holo.Light">
    ...
</style>
复制代码

如今像您使用任何其余主题那样使用该主题,您的应用将在其运行于 Android 3.0 或更高版本的系统上时自动切换到全息主题。

相关文章
相关标签/搜索