动态的改变程序的主题

在这个教程中,我将对android中的主题做一个简短的介绍,用户可以通过点击一个按钮,动态的在程序运行时改变主题。

主题介绍

在android中,“主题”是一种统一定义你的用户界面的简单的方式。从长远来看,定义一个主题不仅可以节省你编写代码的时间,也意味着如果你进行UI调整,紧紧需要在一个地方进行改动。这样做节省了你的时间,降低了人为造成的错误。

主题和风格常常在很多android教程互换使用。为了清晰起见,我们将在本教程中关注主题。它们的区别:

1、  主题是一组格式规则,应用在活动或者程序中。

2、  风格(style)是应用的一个视图中的一组规则。

创建一个自定义主题

在android平台中包括一个预定义的主题,也很容易创建自己的主题,两者之间可以很方便的进行转换。

当你创建一个项目是,Eclipse会在res/values下自动生成styles.xml的文件。你可以在styles.xml文件中定义主题。或者你想将风格和主题分开,可以选择为主题建立一个独立的文件。创建themes.xml文件,你可以右击工程,点击new,选择Android XML File。

不管使用那个文件,以下是具体步骤:

1)  添加<resources>标签:

<resources>
</resources>


2)  给你的主题添加一个唯一的名字,添加结束标签,如下:

<resources>
<stylename="BlackTheme" >
</style>
</resources>


3)  定义你的主题的相关属性和值:

<itemname="android:background">#000000</item>

在本教程中,我们将创建两个主题,定义不同的背景颜色和文本颜色:

<resources>
<stylename="BlackTheme" >
<itemname="android:background">#000000</item>
<itemname="android:textColor">#FFFFFF</item>
</style>
<stylename="BlueTheme" >
<itemname="android:background">#B0E0E6</item>
<itemname="android:textColor">#000000</item>
</style>
</resources>


创建布局

要检查主题之间是否正常切换,我们将创建一个布局,用来显示文本和背景颜色的变化。我们也会给用户一种切换主题的方式。

打开你的布局文件,输入如下代码:

<?xmlversion="1.0" encoding="utf-8"?>
<RelativeLayoutxmlns: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/textView1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentTop="true"
android:layout_centerHorizontal="true"
android:layout_marginTop="14dp"
android:text="@string/pick"
android:textAppearance="?android:attr/textAppearanceLarge"/>
<Button
android:id="@+id/blackbutton"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:layout_below="@+id/textView1"
android:text="@string/black"/>
<Button
android:id="@+id/bluebutton"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_alignRight="@+id/blackbutton"
android:layout_below="@+id/blackbutton"
android:text="@string/blue"/>
<EditText
android:id="@+id/editText1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignLeft="@+id/textView2"
android:layout_below="@+id/bluebutton"
android:ems="10"
android:hint="Name"
android:inputType="textPersonName">
</EditText>
<TextView
android:id="@+id/textView2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignRight="@+id/editText3"
android:layout_below="@+id/editText3"
android:text="@string/agree"/>
<EditText
android:id="@+id/editText3"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:layout_below="@+id/editText1"
android:ems="10"
android:hint="Password"
android:inputType="numberPassword"/>
</RelativeLayout>


保存之后可能会提示有错误,不用管,跟进以下步骤。

定义你的Strings

以下定义布局文件定义的几个字符串。打开res/values/strings.xml,修改如下:

<resources>
    <string name="app_name">主题</string>
    <string name="black">黑色</string>
    <string name="blue">蓝色</string>
    <string name="pick">选择颜色</string>
    <string name="agree">同意你的条件。</string>
</resources>


MainActivity.java

现在是重点,打开MainAcitivity(src/com/songsoft/themes),没有的话新建,现在我们来讲解一下。

import android.os.Bundle;
importandroid.app.Activity;
importandroid.view.View;
importandroid.view.View.OnClickListener;


这些是程序需要使用的各种类和接口。其中OnClickListener是响应按钮单击事件。

publicclass MainActivity extends Activity implements OnClickListener
{
/**活动第一次创建是调用*/
@Override
publicvoid onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
themeUtils.onActivityCreateSetTheme(this);
setContentView(R.layout.main);
//这里调用了OnClickListener,现在,忽略Eclipse抛出的错误。
findViewById(R.id.blackbutton).setOnClickListener(this);
findViewById(R.id.bluebutton).setOnClickListener(this);
}
@Override
//点击事件
publicvoid onClick(View v)
{
switch(v.getId())
{
//当按钮单击时调用。
caseR.id.blackbutton:
themeUtils.changeToTheme(this,themeUtils.BLACK);
break;
caseR.id.bluebutton:
themeUtils.changeToTheme(this,themeUtils.BLUE);
break;
}
}
}


将主题同时设置黑色和蓝色是不可能的,因此添加break语句。

注意,这一节将抛出大量的错误,我们将在下一节创建themeUtils类来消除这些警告和错误。

创建themeUtils.java

下面是创建我们在MainActivity.java中提到的新类,并创建一些静态方法来支持主题的变化。

打开src/com.songsoft.themes,右键单击,创建一个类,输入名字themeUtils

如图:

打开这个文件,输入以下代码:

packagecom.songsoft.themes;
importandroid.app.Activity;
importandroid.content.Intent;
 public class themeUtils
{
privatestatic int cTheme;
publicfinal static int BLACK = 0;
publicfinal static int BLUE = 1;
publicstatic void changeToTheme(Activity activity, int theme)
{
cTheme =theme;
activity.finish();
activity.startActivity(newIntent(activity, activity.getClass()));
 }
publicstatic void onActivityCreateSetTheme(Activity activity)
{
switch(cTheme)
{
default:
caseBLACK:
activity.setTheme(R.style.BlackTheme);
break;
caseBLUE:
activity.setTheme(R.style.BlueTheme);
break;
}
}
}


检查一下

themeUtils创建完成后,点击保存,所有的提示错误消失。

启动模拟器,这里的版本是Android2.3.3。看看效果。

 

感兴趣的同学可以改一下相关代码,添加相关按钮,增加主题。

上一篇:presto的使用


下一篇:机器学习实战第五章(Chapter5):Logistic回归-程序原理详解