您的位置:华清远见教育科技集团 >> Android资料 >> Android如何自定义样式和主题  
 
Android如何自定义样式和主题
分享到:

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的函数之前调用。

 更多相关文章

·Android触摸事件处理
·Android按键事件处理过程详解
·Android系统菜单之快捷菜单
·Android系统菜单之子菜单
·Android系统菜单之选项菜单