Android 中的样式与主题

来源:互联网 发布:lil pump 知乎 编辑:程序博客网 时间:2024/05/22 12:50
Styles and Themes

一、样式:
指定View或者Window的外观和格式的属性集合,这些属性包括:height/pading/font color/font size/background color 等等。样式被定义在XML资源文件中,这些资源文件从LayoutXML文件中分离而来。

一般情况下,Layout文件中的TextView是这样写:

<TextView
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:textColor="#00FF00"
    android:typeface="monospace"
    android:text="@string/hello" />

但是在使用样式后,就可以这样写:

<TextView
    style="@style/CodeFont"
    android:text="@string/hello" />
所有和样式有关的属性都被移动到了名称为CodeFont样式定义的XML文件中

二、主题:被应用到整个Activity或者整个Application上的样式就叫作主题,而不是说只是应用到一个View上面。
当一个样式被当作主题使用后,Activity或者Application中的所有View都会被此样式所影响。



三、定义Styles
3.1、在res/values目录下新建XML文件。打开后,保证根结点是<resources>
通过添加<style>元素方法添加一个样式,给定一个能唯一标识此样式的name,然后为每一个属性添加<item>元素,这些<item>元素都有属性名字,<item>的值可以为:
keyword string, a hex color, a reference to another resource type, or other value depending on the style property. 
          
<?xml version="1.0" encoding="utf-8"?>
<resources>
    <style name="CodeFont" parent="@android:style/TextAppearance.Medium">
        <item name="android:layout_width">fill_parent</item>
        <item name="android:layout_height">wrap_content</item>
        <item name="android:textColor">#00FF00</item>
        <item name="android:typeface">monospace</item>
    </style>
</resources>
在定义样式的属性时,属性名要带上android前缀,但是应用于一个View时,直接写@style/codefont
3.2、style元素中的parent属性是可选的,它指向另一个样式的资源ID,可以从这个样式中继承属性,当  然,如果你愿意,也可以更改这些属性。

四、关于样式的继承

<style>元素下面的parent属性指向一个样式,自定义的样式就从这个样式中继承所有的属性名,你可以继承已经存在样式的属性名 ,并进行一些修改添加,也可以继承自己写的样式。例如:继承Android平台的默认文本样式,并修改如下
<style name="GreenText" parent="@android:style/TextAppearance">        <item name="android:textColor">#00FF00</item></style>
如果只是想继承自定义的样式,就不必在<stytle>元素中使用parent属性了,只要把想继承的样式名称作为你新样式名字的前缀就行
  <style name="CodeFont.Red">        <item name="android:textColor">#FF0000</item>  </style>
也可以继续以这种方式向下继承,多少次都行,只要你愿意
<style name="CodeFont.Red.Big">        <item name="android:textSize">30sp</item></style>
不过以上的继承写法只适用于继承自定义的样式,如果要继承系统样式,还得再加上parent属性。

五、样式的属性名

你已经知道了如可定义样式,但还得知道由<item>元素定义的可用的样式属性名都有哪些。
对于要应用于一个特定View上的样式来说,去对应的View的类中去找这些属性是再合适不过了,里面列出了所有XML支持的属性,举个例子:所有TextView XML 属性表列出的属性都可用于对TextView元素的样式定义。
R.attr引用了所有可用的样式属性名,但是要记住的是,并不是所有的View类都可以接受所有样式属性,如果你把一个样式应用到一个View上,但是这个View不支持样式中所有的样式属性,View只会让自己支持的属性值生效,其它的一律忽略。

另外,还有一些属性,不适用于任何View元素,只能当作theme用,它作用于整个window而不是某种类型的View,比如一些主题中的样式属性可以隐藏应用标题、状态条、改变window的背景。这些theme-only的样式属性在R.attr中以window开头,它们只是作为Activity或整个应用的theme时才会生效。


六、给UI添加样式和主题
两种方法:
1、对于单个的View,在Layout文件中添加style属性。
2、对于整个Activity或者整个应用,在清单文件中的<activity>或者<application>结点下添加    android:theme属性

如果把样式应用于单个的View,样式中定义的属性只会影响到此View。但是,如果把样式应用到一个ViewGroup,只有直接应用样式的元素会受到影响,它的子View不会受到影响,除非你把这个样式设置为一Theme。

常用的Android自带theme:
<activity android:theme="@android:style/Theme.Dialog">
让你的应用看起来像对话盒子。

<activity android:theme="@android:style/Theme.Translucent">
背景透明

如果你觉得一个Theme不错,但是想微调一下,就自定义一个样式,把它做为parent,然后再修改你要改的属性就行了
<color name="custom_theme_color">#b0b0ff</color><style name="CustomTheme" parent="android:Theme.Light">    <item name="android:windowBackground">@color/custom_theme_color</item>    <item name="android:colorBackground">@color/custom_theme_color</item></style>
要注意的是,android:windowBackground属性只支持资源的引用,而不是资源的直接文字描述,不像android:colorBackground,直接给它个颜色值就可以 。

七、根据平台版本选择主题
Android的新版本有好多附加的主题可以用,如果在用新主题的同时,还能保证对低版本的兼容就好了,下面就是解决方案:
用自定义样式,通过resource selection基于不同的平台版本在不同的父主题之间切换
例如:声明自定义样式,以标准平台版本的默认Light主题为父主题,把文件放入res/values目录下
<style name="LightThemeSelector" parent="android:Theme.Light">    ...</style>
为了能实现应用运行在3.0以上版本时,使用新的 holographic主题,你可以在res/values-v11目录下放一个此自定义样式的文件副本,但是把父样式改成 holographic
<style name="LightThemeSelector" parent="android:Theme.Holo.Light">    ...</style>
接下来的事件,就交给Android系统做吧。

八、使用平台自带的样式和主题
Android平台提供了大量的样式和主题,可以在R.style类中找到所有可用的样式引用,使用时,把下划线改成点就行,比如我要使用Theme_NoTitleBar,用的时候改成这样:"@android:style/Theme.NoTitleBar"

不过,R.style类引用对样式解释与描述的不够彻底,所以,看样式和主题实际的源代码更有助于对哪些样式提供哪些属性的理解,
  • Android Styles (styles.xml)
  • Android Themes (themes.xml)
0 0
原创粉丝点击