惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

B
Blog
量子位
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
Last Week in AI
Last Week in AI
酷 壳 – CoolShell
酷 壳 – CoolShell
人人都是产品经理
人人都是产品经理
Jina AI
Jina AI
雷峰网
雷峰网
博客园_首页
WordPress大学
WordPress大学
博客园 - 司徒正美
爱范儿
爱范儿
博客园 - 聂微东
IT之家
IT之家
美团技术团队
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
博客园 - 三生石上(FineUI控件)
有赞技术团队
有赞技术团队
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
T
Tailwind CSS Blog
博客园 - Franky
V
V2EX
GbyAI
GbyAI
阮一峰的网络日志
阮一峰的网络日志

博客园 - 蔡清华

数据库中查询的各种连接(左连接,右连接,全连接,内连接,交叉连接,自连接) Android RenderScript 的使用基础篇 Android应用启动后自动创建桌面快捷方式 Android API教程:人脸检测(Face Detect) Android应用中通过AIDL机制实现进程间的通讯实例 Android开发:如何实现TCP和UDP传输 用户授权认证过程 Android应用自动更新功能的代码实现 Android蓝牙开发浅析 网络通信的中文乱码问题 (转)android中 检查网络连接状态的变化,无网络时跳转到设置界面 Android开发之OpenGL+ES教程 android 示例源码 android 图片处理 android 开发环境搭建 Android 之 内存管理 Android编程获取网络连接状态(3G/Wifi)及调用网络配置界面 android 网络拨号流程 Android_launcher的源码详细分析
Android应用如何实现换主题功能
蔡清华 · 2011-09-13 · via 博客园 - 蔡清华

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

如果想要用自己的应用程序替代现在Android的Home(Launcher)可以在自己Activity的intent-filter中加入categroy.HOME

        <activity android:name=".MyHomeDemo"

                  android:label="@string/app_name">

            <intent-filter>

                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.HOME" />

                <category android:name="android.intent.category.DEFAULT" />

            </intent-filter>

        </activity>