您的位置:首页 > 移动开发 > Android开发

Android应用切换主题代码

2012-01-04 21:09 344 查看
转自:http://hi.baidu.com/lupingloveyou/blog/item/ce75bc22483581e8d7cae21a.html

Form:http://dev.10086.cn/blog/?uid-3072-action-viewspace-itemid-880

本文将介绍如何实现Android应用的换主题功能。假设一个简单的场景:有2套主题,一套绿色,一套黑色的。应用界面就一个按钮,每点击一下,按钮和背景都切换为不同的主题,如当前为黑色主题,下一次就为绿色主题,再下一次为黑色,以此类推。

打开Eclipse,新建三个Android工程项目,名字分别为BlackSkin、GreenSkin和MainSkin。BlackSkin和GreenSkin分别对应黑色、绿色主题资源,MainSkin为主应用。

BlackSkin

该工程下没有任何代码,只是在res\drawable目录下放置2张图片,一张黑色的背景,一张黑色的按钮图片。接着修改AndroidManifest.xml文件。

<?xml version="1.0" encoding="utf-8"?>

<manifest xmlns:android="http://schemas.android.com/apk/res/android"

android:versionCode="1"

android:versionName="1.0"

package="net.toeach.blackskin"

android:sharedUserId="net.toeach.MainSkin">

<uses-sdk android:minSdkVersion="3" />

</manifest>

GreenSkin

与BlackSkin项目一样,该工程下也没有任何代码,只是在res\drawable目录下放置2张图片,一张绿色的背景,一张绿色的按钮图片。接着修改AndroidManifest.xml文件。

<?xml version="1.0" encoding="utf-8"?>

<manifest xmlns:android="http://schemas.android.com/apk/res/android"

android:versionCode="1"

android:versionName="1.0"

package="net.toeach.greenskin"

android:sharedUserId="net.toeach.mainskin">

<uses-sdk android:minSdkVersion="3" />

</manifest>

我们知道Android给每个APK进程分配一个单独的用户空间,其manifest中的userid就是对应一个Linux用户的(Android 系统是基于Linux)。所以不同APK(用户)间互相访问数据默认是禁止的,但是它也提供了2种APK间共享数据的形式:

1. Share Preference. / Content Provider

APK可以指定接口和数据给任何其他APK读取,需要自己实现接口和Share的数据.

2. Shared User id

通过Shared User id,拥有同一个User id的多个APK可以配置成运行在同一个进程中。所以默认就是可以互相访问任意数据。也可以配置成运行成不同的进程,同时可以访问其他APK的数据目录下的数据库和文件。就像访问本程序的数据一样。本文中的换主题功能就是通过这种方式来实现的。

MainSkin

该工程为主应用,我们新建立一个Activity类,叫MainActivity.java。代码如下:

public class MainActivity extends Activity {

private LinearLayout showBg;

private Button btn;

private Context greenSkinContext = null;

private Context blackSkinContext = null;

int flag = 0;

@Override

public void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.main);

try {

greenSkinContext = this.createPackageContext("net.toeach.greenskin", Context.CONTEXT_IGNORE_SECURITY);

blackSkinContext = this.createPackageContext("net.toeach.blackskin", Context.CONTEXT_IGNORE_SECURITY);

} catch (NameNotFoundException e) {

e.printStackTrace();

}

showBg = (LinearLayout) findViewById(R.id.linear_layout_1);

btn = (Button) findViewById(R.id.btn_change_skin);

btn.setOnClickListener(new OnClickListener() {

@Override

public void onClick(View v) {

if (flag == 0) {

//访问GreenSkin下的资源

showBg.setBackgroundDrawable(greenSkinContext.getResources().getDrawable(R.drawable.bg));

btn.setBackgroundDrawable(greenSkinContext.getResources().getDrawable(R.drawable.btn_normal));

flag = 1;

} else if (flag == 1) {

//访问BlackSkin下的资源

showBg.setBackgroundDrawable(blackSkinContext.getResources().getDrawable(R.drawable.bg));

btn.setBackgroundDrawable(blackSkinContext.getResources().getDrawable(R.drawable.btn_normal));

flag = 0;

}//end of if

});

}//end of method

}//end of class

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: