Android 主题切换

1.APK文件方式:(CM9方案)
优点:代码简洁,可使用android本土访问资源的方式引用资源包里的样式如:R.id.XXX
缺点:需将资源包打成APK,非开发人员可能无法完成该任务。
第一步:
    新建 android工程theme_prj(为样式工程),package为: com.theme_prj  在theme_prj工程的drawable文件夹下放入back.png文件,然后安装。

第二步:
    新建 android工程main_prj(为主工程,这里的例子是主工程引用样式工程里的资源文件,以达到切换主题的效果),在main_prj文件夹中也放入back.png,注意 back.png与theme_prj工程里的back.png只是名称相同,是完全不同的两个图片文件,一个为黑色,一个为白色。

第三步:
    将main_prj的layout文件main.xml的背景颜色设置为back.png ,假如 main.xml文件为:
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:id="@+id/layout"
    android:background="@drawable/back"
    >
    <Button android:id="@+id/btn"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"/>

    <LinearLayout />
第四步:
    编写MainActivity

    this.setContentView(R.layout.main); 
    final LinearLayout layout= (LinearLayout) this.findViewById(R.id.layout);
    Button btn = (Button) this.findViewById(R.id.btn);
    btn.setOnClickListener(new OnClickListener() {
           
            @Override
            public void onClick(View v) {
               //获取样式工程的Context
               Context app_theme = this.createPackageContext(" com.theme_prj",
                        Context.CONTEXT_IGNORE_SECURITY);
               //获取样式工程资源
               Resources res = app_theme.getResources();
               //将样式工程的资源设置为背景图
               layout.setBackgroundDrawable(res.getDrawable(R.drawable.back));
            }
        });

2.读取zip文件的方式:(高通方案)
优点:非开发人员也可以很轻松的完成资源包任务。
缺点:代码比起APK方式相对比较繁琐,需要考虑图片文件完整、和一些异常等因素。这种方式有关问题就是每次需要读取zip流,这样性能太差,可以考虑单例设计。

    第一步:程序里所有引用资源的地方改为读路径的方式,不使用android本土R.的方式。
    第二步:完成资源所需的所有图片文件和资源相关说明放在一个文件夹压缩打包。
    第三步:指定读取资源压缩包的相关约定协议,比如该主题名称等信息以约定格式存储。
    第四步:程序读取资源压缩包约定格式的资源信息,加载。
 
3.读取文件的方式:
优点:性能较好,可以更换theme,layout,xml等大部分文件,
缺点:每个xml文件必须放在源码中编译后取其二进制文件。不便于大量使用和移植,还有个问题就是如果程序添加了新资源文件可能需要重新编译。因为id可能发生了变化。
    第一步:完成资源所需的所有图片文件和资源相关说明放在一个文件夹。
    第二步:程序里所有引用资源的地方改为读路径的方式,不使用android本土R.的方式。
    第三步:指定读取资源文件的相关约定协议,比如该主题名称等信息以约定格式存储。
    第四步:程序读取资源压缩包约定格式的资源信息,加载。
 
我还在研究如何实现到MIUI的效果,希望能实现修改所有的资源文件,不用编译成二进制文件,不用修改每个程序的代码,只要修改好框架层,通过主题的状态加载相关资源。然后将要修改的资源文件都放在某个文件夹下就可以实现效果。这样可以便于大量移植,第三方人员也能很方便的修改主题。
 

你可能感兴趣的:(Android 主题切换)