Android样式和主题
如果已经熟悉在网页设计中的层叠样式表(CSS),了解Android样式也是非常相似。每个 Android 窗口小部件,可以设置更改应用程序外观风格相关的属性。样式可以指定属性,如高度,填充,字体颜色,字体大小,背景颜色以及其它。
可以指定这些属性在布局文件如下:
<?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" android:layout_width="wrap_content" android:layout_height="wrap_content" android:capitalize="characters" android:textColor="#00FF00" android:typeface="monospace" android:text="@string/hello_world" /> </LinearLayout>
不过这样一来,我们需要定义的样式属性,每个属性分别用于源代码维护的角度来看这是非常不好的。因此,样式定义应该放在单独的文件,如下解释。
定义样式
样式可以定义在一个单独的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布局文件使用样式属性,如下所示:
<?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 的样式,可以检查 样式实例。
样式继承
Android支持级联样式表在网页设计风格非常类似继承这种方式。可以使用这个继承现有的样式属性,然后定义想要更改或添加属性。
其操作简单,创建一个新的的样式继承LargeFont上述CustomFontStyle风格定义,但字体的大小变大,可以编写这样的新的样式:
<?xml version="1.0" encoding="utf-8"?> <resources> <style name="CustomFontStyle.LargeFont"> <item name="android:textSize">20ps</item> </style> </resources>
@style/CustomFontStyle.LargeFont 的XML布局文件,可以参考这个新的样式。可以继续秉承这样多次,只要愿意,周期通过链接名称。例如,可以扩展FontStyle.LargeFont的是红色的,如下:
<?xml version="1.0" encoding="utf-8"?> <resources> <style name="CustomFontStyle.LargeFont.Red"> <item name="android:textColor">#FF0000</item>/> </style> </resources>
继承这种技术通过链接在一起的名字仅适用于自己的资源定义的样式。不能继承:Android内置样式的这种方式。要引用一个Android内置风格,如TextAppearance,必须使用父属性,如下所示:
<?xml version="1.0" encoding="utf-8"?> <resources> <style name="CustomFontStyle" parent="@android:style/TextAppearance"> <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>
Android 主题
希望能够理解样式的概念,现在让我们去了解什么是主题。主题是什么,主题只不过是要Android应用到整个活动或应用程序中统一样式,而不是一个单独的视图样式。
因此,当一个样式应用为主题,将适用于每一个活动或应用程序视图它支持每个样式属性。例如,可以应用一个主题Activity 活动的的同一CustomFontStyle风格,然后内部的所有文本,活动都会有绿色环保等宽字体。
要设置应用程序的所有活动的主题,打开AndroidManifest.xml文件,编辑<application>标签包含了android:theme 属性的风格名称。例如:
<application android:theme="@style/CustomFontStyle">
但是,如果想有一个主题,只是在应用程序的一个Activity 活动,然后添加android:theme属性到<activity>标签。例如:
<activity android:theme="@style/CustomFontStyle">
有一些由Android定义的默认主题,可以直接使用或继承父属性如下:
<style name="CustomTheme" parent="android:Theme.Light"> ... </style>
要理解这个概念,有关Android的主题,可以查看 主题示例。
默认样式和主题
Android平台提供了一个大集合,可以在应用程序中使用的风格和主题。可以在R.style类的参考找到所有可用的样式。要使用这里列出的风格,在一个样式名替换所有下划线。例如,可以应用Theme_NoTitleBar主题使用如“@android:style/Theme.NoTitleBar”。可以看到下面的源代码为Android的风格和主题: