在设计应用程序时, 你可以使用样式和主题来对不同的屏幕和UI 元素进行统一的格式化.

  • 样式是一组格式化属性, 你可以将它作为一个整体作用于布局xml文件中的一个单独的元素. 例如, 你可以定义一个指定某种文字大小和颜色的样式, 然后将它施加于某种类型的View元素.
  • 主题是一组格式化属性, 你可以将它作为一个整体,作用于你的应用程序中的所有activity, 或者某个单独的activity. 例如, 你可以定义一个主题, 指定窗口框和面板的颜色, 菜单的字体和颜色, 然后把它作用于你的程序中的activity.

样式和主题都是资源. android提供了一些默认的样式和主题资源, 你也可以定义你自己的主题和样式资源.

创建样式和主题的步骤如下:


  1. 创建一个名为styles.xml的文件在你的程序的res/values目录下. 增加一个根<resources>节点.
  2. 对每一种样式或主题, 增加一个<style>元素, 该元素有一个唯一的名字, 有一个可选的parent属性. 名字用于引用这些样式, 而parent属性指定它们继承什么样式资源.
  3. 在<style> 元素中, 使用<item>元素定义格式属性. 每个<item>使用名字属性来指定属性, 并在该元素中定义该属性的值.
  4. 可 以从其它xml资源, manifest或者应用程序代码中引用这些资源.

Styles 样式

这里是一个样式的例子:


<?xml version="1.0" encoding="utf-8"?>
<resources>
     <style name="SpecialText" parent="@style/Text">
         <item name="android:textSize">18sp</item>
         <item name="android:textColor">#008</item>
     </style>
</resources>



如上所 示, 你可以使用<item>元素来设定特定的格式属性. item中的name属性可以指示一个标准的字符串, 一个16进制颜色, 或者引用其它的资源类型.

注意到<style>元素中的parent属性. 该属性让你指定一个资源, 你的当前样式继承于该资源. 样式可以继承任何包含你想要的样式的资源. 一般来说, 你的样式应该总是继承于一个标准的android样式资源. 这样, 你只需要定义你想要改变的部分就可以了.

这里是如何在xml布局中使用样式:


<EditText id="@+id/text1"
           style="@style/SpecialText"
           android:layout_width="fill_parent"
           android:layout_height="wrap_content"
           android:text="Hello, World!" />



现在这个EditText widget 将被使用之前定义的样式.

Themes 主题

就像样 式一样, 主题也是使用xml <style>元素来定义的, 而且也是使用相同方式来引用的. 不同之处是你将一个主题添加到整个程序或者activity, 通过manifest中的<application>和<activity>元素. 主题不能作用于单独的View.

这 里是一个主题的例子:

<?xml version="1.0" encoding="utf-8"?>
<resources>
   <style name="CustomTheme">        
     <item name="android:windowNoTitle">true</item>
     <item name="windowFrame">@drawable/screen_frame</item>
     <item name="windowBackground">@drawable/screen_background_white</item>
     <item name="panelForegroundColor">#FF000000</item>
     <item name="panelBackgroundColor">#FFFFFFFF</item>
     <item name="panelTextColor">?panelForegroundColor</item>
     <item name="panelTextSize">14</item>
     <item name="menuItemTextColor">?panelTextColor</item>
     <item name="menuItemTextSize">?panelTextSize</item>
   </style>
</resources>


注意@和?符号的用法. "@"表示我们在引用一个其它地方定义的资源(可能是在这个工程内, 也可能是android框架定义的). "?"表示我们在引用一个资源值, 这个值在当前加载的主题中. 这是通过查找一个<item>来实现的.(例如?panelTextColor查 找name="panelTextColor" 的item.)

Set the theme in the manifest 在manifest文件中设置主题

如果要给一个应用程序中给所有的activity设定一个主题, 编辑AndroidManifest文件:


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


如 果要给某个activity设定一个主题, 将上面的application改为activity即可.

有一些你不 必定义就可以直接用的主题. 例如Dialog主题让你的activity像一个对话框:


<activity android:theme="@android:style/Theme.Dialog">


如果你喜欢某个主题, 但希望能调整一些地方, 那么就将该主题设为你的自定主题的parent.例如, 我们希望调整Theme.Dialog主题:


<style name="CustomDialogTheme" parent="@android:style/Theme.Dialog">


Set the theme from the application 在程序中设置主题

你也可以在程序中使用setTheme()方法加载一个主题. 主题, 你必须首先设置主题, 然后才能初始化View对象, 例如, 在调用 setContentView(View) 或者 inflate(int, ViewGroup)之前. 这样才能保证你对你所有的UI屏幕使用了同样的主题. 例如:

protected void onCreate(Bundle savedInstanceState) {
     super.onCreate(savedInstanceState);
     ...
     setTheme(android.R.style.Theme_Light);
     setContentView(R.layout.linear_layout_3);
}


如 果你希望在程序中加载一个主题, 注意该主题不会在系统启动activity的动画中加载, 因为这个动画是在你的程序启动之前发生的. 大部分情况下, 在xml里面设置主题是一个更好的方法.