android 换肤换主题(apk包方式)

更换皮肤的方式有很多种,有更换背景图片的(图片来源于程序资源文件、sdCard、网络下载)、有更换theme样式的、也有apk的等等。

用apk的方式更换程序皮肤,这样的方式,方便,简单,而且使主程序的apk包较小。

先下载皮肤apk包,安装,然后使现在的程序读取新安装的apk包中的资源文件,下次再打开程序时,依旧读取的是上次设置的apk的资源,如果主题apk被卸载,那么就读取的是默认的资源。

核心代码(完整代码见项目压缩包)如下:

主程序:

读取已经安装了的皮肤包的包名、应用图标和应用名称,当然最重要的实包名,这样可以通过包名,去读取当前皮肤包中的其它资源的资源名称,从而去加载。

private Runnable
serachSkin = new Runnable() {

@Override

public
void run() {

PackageManager manager =
context.getPackageManager();

List<PackageInfo> packages = manager.getInstalledPackages(PackageManager.PERMISSION_GRANTED);

List<PackageInfo> skins =
new ArrayList<PackageInfo>();

for (PackageInfo info : packages) {
// 遍历已经安装的皮肤包

if (info.packageName.startsWith("com.theme.")) {
// 与皮肤包的包名对应即可

skins.add(info);

}

}

if (skins.size() > 0) {

Message msg =
mHandler.obtainMessage();

msg.obj = skins;

msg.setData(new Bundle());

msg.what =
MESSAGE_SEARCHED_SKIN;

mHandler.sendMessage(msg);

} else {

mHandler.sendEmptyMessage(MESSAGE_SEARCHED_SKIN_FOR_NONTHING);

}

}

};

this.setOnThemeChangedListener(new OnThemeChangedListener() {

@Override

public
void onChanged(String themePackageName) {

Log.i("",
"themePackageName :: " + themePackageName);

try {

Context themeContext = ThemeSecondActivity.this.createPackageContext(themePackageName, Context.CONTEXT_IGNORE_SECURITY);

Resources themeResources = themeContext.getResources();

setControlsStyle(themePackageName, themeResources);

}
catch (NameNotFoundException e) {

e.printStackTrace();

}

}

});

/**

* 设置控件新皮肤

* @param themePackageName 皮肤包的包名

* @param themeResources 皮肤包的资源

*/

private
void setControlsStyle(String themePackageName, Resources themeResources) {

Log.i("",
"themePackageName :: " + themePackageName);

button.setBackground(themeResources.getDrawable(themeResources.getIdentifier("button_selector",
"drawable", themePackageName))); // 确保drawable资源文件中有button_selector文件

gridview.setBackgroundColor(themeResources.getColor(themeResources.getIdentifier("background_gridview",
"color", themePackageName)));

}

找了很久的apk换肤,类似新浪微博或者QQ换肤,找到的案例只是简单的在当前项目中更换主题,或者是apk包,但放置到自己的项目中时,抛出空指针或者资源文件不存在的异常。

纠其原因,因为资源文件没有找到,在当前项目中用的是getDrawable(R.drawable.xx)方式来获取图片,这种方式是根据R.drawable.xx对应的一个int值(int值在工程中的gen文件夹下的R.java的class类中)来识别并加载的,这样要确保主工程与皮肤工程对应的两个值是一样的,如果不一样,就可能出现错位(int值对应到其它的资源),当然还有可能导致空指针或者找不到资源文件(int值不存在)。

决解方式是,确保当前读取的res资源是皮肤包的资源,读取方式是:

Context themeContext = ThemeSecondActivity.this.createPackageContext(themePackageName,Context.CONTEXT_IGNORE_SECURITY);

Resources themeResources = themeContext.getResources();

项目压缩包下载地址:http://download.csdn.net/detail/xue_wei_love/8581235

说明:apk方式更换主题:包括多个页面更换,多个资源更换(可以颜色值、图片、xml文件等自定义资源文件)。 压缩中中包括4个工程,说明如下: SkinTheme是主工程,SkinRed是红色主题包,SkinGreen是绿色主题包,SkinBlue是蓝色主题包。

参考:

http://www.eoeandroid.com/thread-102060-1-1.html

http://bbs.csdn.net/topics/390311059

http://www.2cto.com/kf/201204/129474.html

http://blog.csdn.net/vincent_czz/article/details/7276118

http://www.javaapk.com/source/417.html#

http://down.51cto.com/data/622207

时间: 2024-08-05 07:55:27

android 换肤换主题(apk包方式)的相关文章

vue2.0-基于elementui换肤[自定义主题]

0. 直接上 预览链接 vue2.0-基于elementui换肤[自定义主题] 1. 项目增加主题组件 在项目的src/components下添加skin文件夹 skin文件获取地址 2. 项目增加自定义主题 自定义添加主题下载地址 https://elementui.github.io/theme-chalk-preview/#/zh-CN 3. 项目引入和使用 选择你想要随主题改变的element元素在src/global/themeArray里面,不希望随主题改变的可以注释掉 选择皮肤之后

Android 4.4(KitKat)中apk包的安装过程

原文地址:http://blog.csdn.net/jinzhuojun/article/details/25542011 其实对于apk包的安装,4.4和之前版本没大的差别.Android中app安装主要有以下几种情况:系统启动时安装,adb命令安装,Google Play上下载安装和通过PackageInstaller安装.安装的最核心方法是scanPackageLI(),以上几个安装方式最后都是调用这个函数完成主要工作的,区别在于在此之前的处理过程不同.本文以前两种为主,简要介绍这四种安装

【Android-View】浅谈Android换肤的几种实现方式

Android平台api没有特意为换肤提供一套简便的机制,这可能是外国的软件更注重功能和易用,不流行换肤.系统不提供直接支持,只能自行研究. 换肤,可以认为是动态替换资源(文字.颜色.字体大小.图片.布局文件……).这个使用编程语言来动态设置是可以做到的,例如使用View的 setBackgroundResource.setTextSize.setTextColor等函数.但我们不可能在每个activity里对页面里 的所有控件都通过调用这些函数来换肤,这样的程序代码难以维护.扩展,也违背了UI

Android实现apk插件方式换肤

换肤思路: 1.什么时候换肤? xml加载前换肤,如果xml加载后换肤,用户将会看见换肤之前的色彩,用户体验不好. 2.皮肤是什么? 皮肤就是apk,是一个资源包,包含了颜色.图片等. 3.什么样的控件应该进行换肤? 包含背景图片的控件,例如textView文字颜色. 4.皮肤与已安装的资源如何匹配? 资源名字匹配 步骤: 1.xml加载前换肤,意味着需要将所需要换肤的控件收集起来.因此要监听xml加载的过程. 1 public class BaseActivity extends Activi

Android主题换肤 无缝切换

2016年7月6日 更新:主题换肤库子项目地址:ThemeSkinning,让app集成换肤更加容易.欢迎star以及使用,提供改进意见. 更新日志: v1.3.0:增加一键切换切换字体(初版)v1.2.1:完善之前版本View的创建v1.2.0:增加对换肤属性自定义扩展v1.1.0:可以直接加载网络上的皮肤文件 今天再给大家带来一篇干货. Android的主题换肤 ,可插件化提供皮肤包,无需Activity的重启直接实现无缝切换,可高仿网易云音乐的主题换肤. 这个链接是本次的Demo打包出来的

Android 打造自己的个性化应用(一):应用程序换肤主流方式的分析与概述

Android平台api没有特意为换肤提供一套简便的机制,这可能是外国的软件更注重功能和易用,不流行换肤.系统不提供直接支持,只能自行研究. 换肤,可以认为是动态替换资源(文字.颜色.字体大小.图片.布局文件……).这个使用编程语言来动态设置是可以做到的,例如使用View的setBackgroundResource.setTextSize.setTextColor等函数.但我们不可能在每个activity里对页面里的所有控件都通过调用这些函数来换肤,这样的程序代码难以维护.扩展,也违背了UI和代

Android中插件开发篇之----应用换肤原理解析

一.前言 今天又到周末了,感觉时间过的很快呀.又要写blog了.那么今天就来看看应用的换肤原理解析.在之前的一篇博客中我说道了Android中的插件开发篇的基础:类加载器的相关知识.没看过的同学可以转战: http://blog.csdn.net/jiangwei0910410003/article/details/41384667 二.原理介绍 现在市场上有很多应用都有换肤的功能,就是能够提供给用户一些皮肤包,然后下载,替换.而且有些皮肤是要收费的.对于这个功能的话,其实没有什么技术难度的,但

android 换肤模式总结

由于Android的设置中并没有夜间模式的选项,对于喜欢睡前玩手机的用户,只能简单的调节手机屏幕亮度来改善体验.目前越来越多的应用开始把夜间模式加到自家应用中,没准不久google也会把这项功能添加到Android系统中吧. 业内关于夜间模式的实现,有两种主流方案,各有其利弊,我较为推崇第三种方案: 1.通过切换theme来实现夜间模式.2.通过修改uiMode来切换夜间模式. 3.通过插件方式切换夜间模式. 值得一提的是,上面提到的几种方案,都是资源内嵌在Apk中的方案,像新浪微博那种需要通过

Android换肤技术总结

原文出处: http://blog.zhaiyifan.cn/2015/09/10/Android%E6%8D%A2%E8%82%A4%E6%8A%80%E6%9C%AF%E6%80%BB%E7%BB%93/ 背景 纵观现在各种Android app,其换肤需求可以归为 白天/黑夜主题切换(或者别的名字,通常2套),如同花顺/自选股/天天动听等,UI表现为一个switcher. 多种主题切换,通常为会员特权,如QQ/QQ空间. 对于第一种来说,目测应该是直接通过本地theme来做的,即所有图片/