Android - 样式和主题
style 资源定义了 UI 的格式和外观。样式可以应用于单个 View(从布局文件中)或整个 Activity 或应用(从清单文件中)。
定义样式
样式在与指定布局的 XML 分开的 XML 资源中定义。此 XML 文件位于项目的 res/values/ 目录下,并以 <resources> 作为根节点,这是样式文件的必备元素。XML 文件的名称任意,但必须使用 .xml 扩展名。
您可以使用 <style> 标签在单个文件中定义多个样式,但每个样式都有其唯一标识名称。Android 样式属性使用 <item> 标签设置,如下所示 −
<?xml version="1.0" encoding="utf-8"?>
<resources>
<style name="CustomFontStyle">
<item name="android:layout_width">fill_parent</item>
<item name="android:layout_height">wrap_content</item>
<item name="android:capitalize">characters</item>
<item name="android:typeface">monospace</item>
<item name="android:textSize">12pt</item>
<item name="android:textColor">#00FF00</item>/>
</style>
</resources>
<item> 的值可以是关键字字符串、十六进制颜色、对其他资源类型的引用,或根据样式属性而定的其他值。
使用样式
一旦定义了样式,您就可以在 XML 布局文件中使用 style 属性来应用它,如下所示 −
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical" >
<TextView
android:id="@+id/text_id"
style="@style/CustomFontStyle"
android:text="@string/hello_world" />
</LinearLayout>
要了解与 Android Style 相关的概念,您可以查看 Style Demo 示例。
样式继承
Android 以与网页设计中的层叠样式表非常相似的方式支持样式继承。您可以使用此功能从现有样式继承属性,然后仅定义您想要更改或添加的属性。
要实现自定义主题,请创建或编辑 MyAndroidApp/res/values/themes.xml 并添加以下内容 −
<resources> ... <style name="MyCustomTheme" parent="android:style/Theme"> <item name="android:textColorPrimary">#ffff0000</item> </style> ... </resources>
在您的 AndroidManifest.xml 中,将主题应用到您想要设置样式的 activity −
<activity android:name="com.myapp.MyActivity" ... android:theme="@style/MyCustomTheme" />
您的新主题将应用到您的 activity,文本现在是鲜红色的。
将颜色应用到主题属性
您的颜色资源可以通过向自定义主题添加 <item> 元素来应用到某些主题属性,例如窗口背景和主要文本颜色。这些属性在您的 styles.xml 文件中定义。例如,要将自定义颜色应用到窗口背景,请在 MyAndroidApp/res/values/styles.xml 文件中定义的自定义主题中添加以下两个 <item> 元素 −
<resources>
...
<style name="MyCustomTheme" ...>
<item name="android:windowBackground">@color/my_custom_color</item>
<item name="android:colorBackgroundCacheHint">@color/my_custom_color</item>
</style>
...
</resources>

使用自定义 Nine-Patch 与按钮
nine-patch drawable 是一种特殊的图像,可以在保持视觉完整性的同时缩放宽度和高度。Nine-patch 是指定 Android 按钮外观的最常见方式,尽管也可以使用任何 drawable 类型。
Nine-Patch 按钮示例
创建 Nine-Patch 按钮的步骤
- 将此位图保存为 /res/drawable/my_nine_patch.9.png
- 定义一个新 style
- 将新按钮 style 应用到自定义 theme 的 buttonStyle 属性
定义新 Style
<resources>
...
<style name="MyCustomButton" parent="android:Widget.Button">
<item name="android:background">@drawable/my_nine_patch</item>
</style>
...
</resources>
应用 Theme
<resources>
...
<style name="MyCustomTheme" parent=...>
...
<item name="android:buttonStyle">@style/MyCustomButton</item>
</style>
...
</resources>
Android 主题
希望你已经理解了 Style 的概念,现在让我们来了解什么是 Theme。Theme 就是一个应用于整个 Activity 或应用程序的 Android style,而不是单个 View。
因此,当 style 被作为 theme 应用时,Activity 或应用程序中的每个 View 都会应用它所支持的每个 style 属性。例如,你可以将相同的 CustomFontStyle style 作为某个 Activity 的 theme 应用,然后该 Activity 中的所有文本都将使用绿色等宽字体。
要为应用程序的所有 activity 设置 theme,请打开 AndroidManifest.xml 文件并编辑 <application> 标签,添加 android:theme 属性并指定 style 名称。例如:
<application android:theme="@style/CustomFontStyle">
但如果你只想将 theme 应用到应用程序中的一个 Activity,则只需在 <activity> 标签中添加 android:theme 属性。例如:
<activity android:theme="@style/CustomFontStyle">
Android 定义了许多默认 theme,你可以直接使用它们,或使用 parent 属性继承它们,如下所示:
<style name="CustomTheme" parent="android:Theme.Light"> ... </style>
要了解与 Android Theme 相关的概念,你可以查看 Theme Demo 示例。
样式化颜色调色板
布局设计可以基于主题颜色来实现,例如以下设计就是基于主题颜色(蓝色)设计的。
上述布局是基于 style.xml 文件设计的,该文件位于 res/values/ 目录下。
<resource>
<style name="AppTheme" parent="android:Theme.Material">
<item name ="android:color/primary">@color/primary</item>
<item name ="android:color/primaryDark">@color/primary_dark</item>
<item name ="android:colorAccent/primary">@color/accent</item>
</style>
<resource>
默认样式与主题
Android 平台提供大量可用于应用程序的样式和主题集合。你可以在 R.style 类中找到所有可用样式的参考。要使用此处列出的样式,请将样式名称中的下划线替换为句点。例如,你可以使用 "@android:style/Theme.NoTitleBar" 来应用 Theme_NoTitleBar 主题。你可以查看以下 Android 样式和主题的源代码:
Android 样式 (styles.xml)
Android 主题 (themes.xml)