Android 风格和主题

Android xml风格和主题文件的编写,是涉及到整个程序界面美观的因素之一。当设计应用程序时,你可以用风格和主题来统一格式化各种屏幕和UI元素。较好的应用风格和主题,可以实现美观而统一的界面,和web中的CSS一样,Android也可以为界面定义全局、公用的Style。

Styles和Themes都是资源文件位于res/values,当然,可以用Android提供的一些默认的风格和主题资源,也可以自定义自己的主题和风格资源。

Styles:
风格是一个包含一种或者多种格式化属性的集合,可以将其作为一个单位用在布局XML单个元素当中。比如,可以定义一种风格来定义文本的文字大小和颜色,然后将其应用于视图元素的一个特定实例。

Theme:
主题是一个包含一种或者多种格式化属性的集合,可以将其作为一个单位用在应用程序所有的活动当中或者某个活动当中。比如,可以定义一个主题,它为window frame和panel 的前景和背景设置了特定的颜色,并为菜单定义文字的大小和颜色属性,然后将这个Theme应用到应用程序的Activity中。

Style和Theme的XML文件结构:
对每一个Styles和Themes,有一个<resources>根节点,给<style>元素增加一个全局唯一的名字,也可以选择增加一个父类属性。在后边我们可以用这个名字来应用风格,而父类属性标识了当前风格是继承于哪个风格。在<style>元素内部,申明一个或者多个<item>,每一个<item>定义了一个名字属性,并且在元素内部定义了这个风格的值。

新建自定义的风格和主题 :
1.在res/values 目录下新建一个名叫style.xml的文件。
2.对每一个风格和主题,给<style>元素增加一个全局唯一的名字,和一个可选的父类属性。在后边我们可以名字来应用风格,而父类属性标识了当前风格是继承于哪个风格。

3.在<style>元素内部,申明一个或者多个<item>,每一个<item>定义了一个名字属性,并且在元素内部定义了这个风格的值。

4.然后可以在其他XML资源,manifest或应用程序代码中引用这些自定义资源。

风格Styles(SDK提供的Style的例子) :

<?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>元素中的父类属性。这个属性让你可以能够定义一个资源,当前风格可以从这个资源当中继承到值。你可以从任何包含这个资源当中继承此风格。通常上,你的资源应该一直直接或者间接地继承Android的标准风格资源。这样的话,你就只需要定义你想改变的值。
在这个例子当中的EditText元素,演示了如何引用一个XML布局文件当中定义的风格:

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

现在这个EditText部件所表现出来的风格将是我们在上边的XML文件中所定义的那样。

另:转载一个自定义实例

1.在res/values 目录下新建一个名叫style.xml的文件。
2.在style.xml定义内容如下:

<?xml version=”1.0″ encoding=”utf-8″?> <resources> <style name=”DavidStyleText1″> <item name=”android:textSize”>18sp</item> <item name=”android:textColor”>#EC9237</item> </style> <style name=”DavidStyleText2″> <item name=”android:textSize”>14sp</item> <item name=”android:textColor”>#FF7F7C</item> <item name=”android:fromAlpha”>0.0</item> <item name=”android:toAlpha”>0.0</item> </style> </resources>
 

上面样式的定义,从字面意思就可以了解其功能了,下面看看如何应用它吧:

<!– 应用样式1的TextView –> <TextView style="@style/DavidStyleText1" android:layout_width=”fill_parent” android:layout_height=”wrap_content” android:gravity=”center_vertical|center_horizontal” android:text=”moandroid”/> <!– 应用样式2的TextView –> <TextView style="@style/DavidStyleText2″ android:layout_width=”fill_parent” android:layout_height=”wrap_content” android:gravity=”center_vertical|center_horizontal” android:text=”www.moandroid.com” android:autoLink=”all”/>
 

现在这个EditText组件的所表现出来的风格就为我们在上边的XML文件中所定义的那样,如下:

Android<wbr><wbr>Styles<wbr><wbr>&<wbr><wbr>Themes(上)

看了新的界面是不是感觉漂亮多了,这也就是Styles的魅力吧。需要补充说明的是:单击超链接,还可以打开网页如下:

Android<wbr><wbr>Styles<wbr><wbr>&<wbr><wbr>Themes(上)

这是如何实现的了?TextView.setTextView不支持HTML TAG的输出,所以即便写成这样:
mTextView01.setText(”<a href=\”http://www.moandroid.com/\”>mo-android|享受Android带给我们的新体验</a>”);实际输出时,也就是纯文本而已,并不会作HTML TAG的转换。但若撇开HTML TAG之外(如“<”开头的标记),在TextView里加上了android:autoLink=”all”,那么正文中若有网址(http://),是可以被显示的。

Theme依然在<style>元素里边申明,也是以同样的方式引用。不同的是通过在Android Manifest中定义的<application>和<activity>元素将主题添加到整个程序或者某个 Activity,但是主题是不能应用在某一个单独的View里。

主题Themes :

就像风格一样,主题依然在<style>元素里边申明,也是以同样的方式引用。不同的是你通过在AndroidManifest中定义的<application>和<activity>元素将主题添加到整个程序或者活动中——主题并不能应用于个别视图。

<?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使用了分配给panelForegroundColor的相同颜色)。这种技巧只能用在XML资源当中。

在manifest中设置主题Set the theme in the manifest :
为了给应用程序所有的活动设置主题,你可以打开清单文件AndroidManifest.xml,编辑<application>标签,让其包含android:theme属性,值是一个主题的名字,如下:

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

Android中提供了几种内置的资源,有好几种主题可以用于切换而不用自己写。如果你只是想让你程序当中的某个Activity拥有这个主题,那么你可以修改<activity>标签。就像Android提供的其他内置资源一样,有好几种主题你可以切换而不用自己写。比如你可以用对话框主题来让你的活动看起来像一个对话框。在manifest中,像下面这样引用一个Android主题:
<activity android:theme="@android:style/Theme.Dialog">

如果你喜欢一个主题,但是想做一些轻微的调整,你只需要将这个主题添加为父主题。比如,我们将修改Theme.Dialog主题。为此,创建一个风格以Theme.Dialog为父主题:
<style name="CustomDialogTheme" parent="@android:style/Theme.Dialog">
就这样,我们已经继承了Android对话框主题,因此我们可以按照自己的意愿来调整主题。这样,对于这个对话框主题中每个我们想要改变的item,我们可以在这里重新定义它的值然后在Android Manifest 文件中使用CustomDialogTheme而不是Theme.Dialog。
在程序当中设置主题Set the theme from the application :
如果需要的话,你还可以以编程的方式来给一个活动加载主题。为此,要使用setTheme()方法。

注意:这样做,你应该在初始化任何上下文中的视图之前设置主题。比如,在用setContentView(View)或者inflate(int, ViewGroup)方法前。这确保系统将当前主题应用在你所有的用户界面屏幕上。
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
...
setTheme(android.R.style.Theme_Light);
setContentView(R.layout.linear_layout_3);
}
如果你打算在程序代码中来加载主界面的主题,那么需要注意这个主题将不能应用于任何系统用来启动这个活动的动画,这些动画将在应用程序启动前发生。在大多数情况下,如果你想将主题应用到你的主界面,在XML中定义是一个更好的办法。

了解关于自定义风格和主题以及如何在应用程序中引用它们的详细信息,参见可用资源类型:风格和主题Available Resource Types: Style and Themes

了解关于缺省可用的主题和风格的信息,参见R.style

另:在转载一个列子定义Theme的一个例子

<?xml version=”1.0″ encoding=”UTF-8″?> <resources> <style name=”NewTheme” parent=”android:Theme.Black”> <item name=”android:windowNoTitle”>true</item> <item name=”android:textSize”>14sp</item> <item name=”android:textColor”>#FFFF0000</item> </style> </resources>
 

  • @ 表明我们应用的资源是前边定义过的(或者在前一个项目中或者在Android 框架中)。
  • ?表明我们引用的资源的值在当前的主题当中定义过。

这些技巧只能用在XML资源当中

这里需要注意的是,对于theme资源的引用,资源ID不是文件名(theme.xml),而是资源名(NewTheme)。运行后的界面显示如下:

Android<wbr><wbr>Styles<wbr><wbr>&<wbr><wbr>Themes(下)

在AndroidManifest.xml中应用Theme

  • 为了在当前所有的Activity当中使用Theme,可以打开AndroidManifest.xml 文件,编辑<application>标签,让其包含android:theme属性,值是一个主题的名字,
  • 例如: <application android:theme=”@style/NewTheme”>
  • 如果只是想让程序当中的某个Activity拥有这个Theme,那么可以修改<activity>标签。Android中提供了几种内置的资源,有好几种Theme你可以切换而不用自己写。比如可以用对话框Theme来让你的Activity看起来像一个对话框。在manifest中定义,
  • 例如: <activity android:theme=”@android:style/Theme.Dialog”>
  • 如果喜欢一个Theme,但是想做一些轻微的改变,只需要将这个Theme添加为parent。Android SDK为我们提供了很多现成的Theme,部分列举如下:
  • 比如:我们修改Theme.Dialog Theme,继承ThemeDialog来生成一个新的Theme。
    <style parent=”@android:style/Theme.Dialog”>
    继承了Theme.Dialog后,我们可以按照我们的要求来调整Theme。我们可以修改在Theme.Dialog中定义的每个item元素的值,然后我们在Android Manifest 文件中使用NewDialogTheme而不是 Theme.Dialog。

感觉经典的Android之主题与样式文章:

1:http://blog.csdn.net/woshishushangdezhu/article/details/4602597

2:http://blog.csdn.net/woshishushangdezhu/article/details/4602656

3:http://www.eoeandroid.com/thread-1277-1-1.html

4:http://blog.csdn.net/woshishushangdezhu/article/details/4602562

更多相关文章

  1. 谷歌将大改Android用户体验 欲取消自定义UI
  2. Android中View的绘制过程 onMeasure方法简述 附有自定义View例子
  3. Android 自定义动画 单个View平面位移以及一组View轮回旋转(二)
  4. Android自定义下拉刷新动画--仿百度外卖下拉刷新
  5. Android之自定义对话框AlertDialog.Builder+getLayoutInflater()
  6. android 自定义dialog
  7. Android 使用自定义View画圆
  8. Android自定义对话框(Dialog)位置,大小

随机推荐

  1. 解决MySQL启动报错:ERROR 2003 (HY000):
  2. mysql连接查询中and与where的区别浅析
  3. 低版本Druid连接池+MySQL驱动8.0导致线程
  4. MySQL 8.0 驱动与阿里druid版本兼容问题
  5. MySQL query_cache_type 参数与使用详解
  6. mysql 数据插入优化方法之concurrent_ins
  7. MySQL的Query Cache图文详解
  8. mysql优化之query_cache_limit参数说明
  9. MySQL中存储时间的最佳实践指南
  10. MySQL连表查询分组去重的实现示例