本文将介绍如何实现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;
}
}
});
}
}

更多相关文章

  1. “罗永浩抖音首秀”销售数据的可视化大屏是怎么做出来的呢?
  2. Nginx系列教程(三)| 一文带你读懂Nginx的负载均衡
  3. 不吹不黑!GitHub 上帮助人们学习编码的 12 个资源,错过血亏...
  4. sqlite实现新闻收藏和取消收藏
  5. Android(安卓)Day03-SQLite数据库操作及ListView详解
  6. android利用BitMap获得图片的像素数据
  7. Android无线连接手机调试
  8. Android(安卓)Activity间传递数据
  9. Android(安卓)ListView 获取网络上的数据,动态地进行数据更新!

随机推荐

  1. android实现圆形头像
  2. Android(安卓)APK 上架
  3. Android之Loader理解
  4. Delphi XE5 android 获取网络状态
  5. Android显示GIF动画完整示例(一)
  6. Android的NDK开发(1)————Android(安
  7. Linearlayout
  8. Why printing from your iPad or Android
  9. Android运行虚拟机报错Execution failed
  10. Android(安卓)Post方法请求URL 迭代器