动态的改变程序的主题
在这个教程中,我将对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。看看效果。
感兴趣的同学可以改一下相关代码,添加相关按钮,增加主题。