Android Styles and Themes

样式

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

主题

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

定义样式

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

该 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 形式引用该示例样式。

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

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

样式继承

通过 <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 或更高版本的系统上时自动切换到全息主题。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值