Android也可以像HTML/CSS中的style一样,使用自定义的style样式。Android一般通过value 文件夹下面新建一个styles.xml文件来设置自定义样式。这里开发者可以设置高度、填充字体颜色、字体大小、背景颜色等描述一个View或者一个窗口的显示属性。这就像Web开发中的CSS样式表,使我们的样式独立于内容进行设计开发。
主题和样式都是通过在xml文件中预定义一系列属性值,通过这些属性值来形成统一的显示风格。不同的是,样式只能应用于某种类型的View;而主题刚好相反,不能应用于特定的View,而只能作用于一个或多个Activity,或是整个应用。
下面通过代码学习一下如何自定义样式与主题,并在程序中应用。
首先是自定义样式和主题。在项目的res/values/目录下添加styles.xml。如代码清单1所示。
代码清单1 styles.xml
<?xml version="1.0" encoding="utf-8"?>
<resources>
<!-- 定义my_style_1,没有指定parent,用系统默认的 -->
<style name="my_style_1">
<!-- 定义与指定View相关的若干属性 -->
<item name="android:hint">load from style 1</item>
</style>
<!-- 定义my_style_2,用自定义的my_style_1作为parent -->
<style name="my_style_2" parent="@style/my_style_1">
<!-- 定义与指定View相关的若干属性 -->
<item name="android:textSize">30sp</item>
<item name="android:textColor">#FFFF0000</item>
<item name="android:hint">load from style 2</item>
</style>
<!-- 定义my_style_3,用android的EditText作为parent -->
<style name="my_style_3" parent="@android:style/Widget.EditText">
<!-- 定义与指定View相关的若干属性 -->
<item name="android:hint">"load from style 3"</item>
<item name="android:textStyle">bold|italic</item>
<item name="android:typeface">monospace</item>
<item name="android:background">@drawable/mybackground</item>
</style>
<!-- 定义MyTheme,用android的Theme作为parent -->
<style name="MyTheme" parent="@android:style/Theme">
<item name="android:textSize">20sp</item>
<item name="android:textColor">#FF0000FF</item>
<item name="android:hint">"load from style 3"</item>
<item name="android:textStyle">bold|italic</item>
<item name="android:typeface">monospace</item>
<item name="android:background">@drawable/gallery_selected_pressed</item>
<item name="myStyle">@style/my_style_3</item>
</style>
</resources>
由上述代码可以看出,主题和样式都可以通过在<style>下添加多个<item>来完成其定义。下面来介绍一下<style>的属性,如表1所示。
表1 <style>的属性
属性名称 |
描述 |
name |
style的名字,引用该style时使用此名字 |
parent |
一些在自定义的style中没有指定的属性会继承parent style中的值。parent可以是android预定义的resource,也可以是自己定义的style。为可选项 |
在<item>中定义需要改变的属性值,例如,可以定义颜色、高度等。Android中能使用的属性可以在<sdk>/docs/reference/android/R.styleable.html中查到;也可以用自己定义的属性值。
下面讲解如何在程序中使用样式:一方面可以在layout的布局文件中指定自定义的样式;另一方面可以在java代码中指定。具体代码如代码清单2、3所示。
代码清单2 在布局文件中指定自定义样式
<EditText android:id="@+id/EditText03"
style="@style/my_style_3"
android:layout_width="fill_parent"
android:layout_height="wrap_content">
</EditText>
代码清单3 在java代码中指定自定义样式
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
LinearLayout ll = (LinearLayout)findViewById(R.id.main);
EditText et = new EditText(this, null, R.attr.myStyle);//指定样式
ll.addView(et);
}
如何在程序中使用自定义主题呢?这与使用自定义样式相似,都可以通过两个方法指定,不同的是主题除了可以在java代码中指定以外,还可以在AndroidManifest中被指定。具体代码如代码清单4、5、6所示。
代码清单4 在AndroidManifest.xml中指定自定义主题——应用于整个程序
<application android:theme="@style/MyTheme">
代码清单5 在AndroidManifest.xml中指定自定义主题——应用于Activity
<activity android:theme="@style/MyTheme">
代码清单6 在java代码中指定自定义主题
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setTheme(R.style.MyTheme);//设置主题
setContentView(R.layout.main);
}
注:setTheme必须在setContentView(),addContentView()或inflate()等实例化View的函数之前调用。