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的效果,但愿能实现修改全部的资源文件,不用编译成二进制文件,不用修改每一个程序的代码,只要修改好框架层,经过主题的状态加载相关资源。而后将要修改的资源文件都放在某个文件夹下就能够实现效果。这样能够便于大量移植,第三方人员也能很方便的修改主题。