`
wangxinasy
  • 浏览: 19350 次
  • 性别: Icon_minigender_1
  • 来自: 南京
文章分类
社区版块
存档分类
最新评论

Android 主题切换功能

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

分享到:
评论
3 楼 不知道yyj 2011-12-30  
运行不了!那个图片找不到
2 楼 ccy222 2011-12-12  
切不过来呀
1 楼 live17909 2011-04-11  
主工程报图片资源找不到呢。是不是还漏了哪里

相关推荐

Global site tag (gtag.js) - Google Analytics