Android 简明教程

Android - Styles and Themes

Defining Styles

一个风格在一个与定义布局的 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>

Using Styles

一旦你的样式定义好,你就可以使用 style 属性在 XML 布局文件中使用它,如下所示 −

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

Style Inheritance

Android 支持样式继承,在很多方面类似于 Web 设计中的级联样式表。你可以使用此方法从现有样式继承属性,然后仅定义你想要更改或添加的属性。

为了实现自定义主题,创建或编辑 MyAndroidApp/res/values/themes.xml 并在其中添加以下内容 −

<resources>
   ...
   <style name="MyCustomTheme" parent="android:style/Theme">
   <item name="android:textColorPrimary">#ffff0000</item>
   </style>
   ...
</resources>

在你的 AndroidManifest.xml 中,将主题应用到你想要应用样式的活动 −

<activity
   android:name="com.myapp.MyActivity"
   ...
   android:theme="@style/MyCustomTheme"
   />

你的新主题将被应用到你的活动中,并且文本现在是亮红色。

them1

Applying Colors to Theme Attributes

然后可以通过将 <item> 元素添加到你的自定义主题来将你的颜色资源应用于一些主题属性,例如窗口背景和主要文本颜色。这些属性是在你的 styles.xml 文件中定义的。例如,要将自定义颜色应用于窗口背景,请将以下两个 <item> 元素添加到你的自定义主题中,该主题定义在 MyAndroidApp/res/values/styles.xml 文件中 −

<resources>
   ...
   <style name="MyCustomTheme" ...>
      <item name="android:windowBackground">@color/my_custom_color</item>
      <item name="android:colorBackgroundCacheHint">@color/my_custom_color</item>
   </style>
   ...
</resources>
them2

Using a Custom Nine-Patch With Buttons

九贴图可拉伸图片是一种可以在保持其视觉完整性的同时缩放其宽度和高度的特殊类型的图片。九贴图是指定 Android 按钮外观最常见的方式,但可以使用任何可拉伸类型。

them3

Steps to create Nine-Patch Buttons

  1. 将该位图保存为 /res/drawable/my_nine_patch.9.png

  2. Define a new style

  3. 将按钮 style 应用到自定义主题的 buttonStyle 属性

Define a new Style

<resources>
   ...
      <style name="MyCustomButton" parent="android:Widget.Button">
      <item name="android:background">@drawable/my_nine_patch</item>
      </style>
   ...
</resources>

Apply the theme

<resources>
   ...
      <style name="MyCustomTheme" parent=...>
         ...
         <item name="android:buttonStyle">@style/MyCustomButton</item>
      </style>
   ...
</resources>
them4

Android Themes

希望你理解了 Style 的概念,那么现在让我们尝试了解什么是 Theme 。主题只不过是应用于整个 Activity 或应用程序的 Android 样式,而不是单个 View。

因此,将样式应用为主题时,Activity 或应用程序中的每个 View 都将应用它支持的每个样式属性。例如,你可以将相同的 CustomFontStyle 样式应用为 Activity 的主题,然后该 Activity 内的所有文本都将具有绿色等宽字体。

要为应用程序的所有 Activity 设置主题,请打开 AndroidManifest.xml 文件并编辑 <application> 标记,其中包含带有样式名称的 android:theme 属性。例如:

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

但是,如果你希望仅将主题应用于应用程序中的一个 Activity,请仅将 android:theme 属性添加到 <activity> 标记。例如:

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

Android 定义了许多默认主题,你可以直接使用它们,或使用 parent 属性继承它们,如下所示:

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

要了解与 Android 主题相关概念,你可以查看 Theme Demo Example

Styling the colour palette

布局设计可以根据基础颜色实现,例如,以下设计就是基于基础颜色(蓝色)设计的:

them5

上述布局是根据 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>

Default Styles & Themes

Android 平台提供了大量你可以在你的应用程序中使用的样式和主题。你可以在 R.style 类中找到所有可用样式的参考。要使用此处列出的样式,请用句点替换样式名称中的所有下划线。例如,你可以用 "@android:style/Theme.NoTitleBar" 应用 Theme_NoTitleBar 主题。你可以查看适用于 Android 样式和主题的以下源代码: