Android 插件化换肤

一个简单的换肤Demo:
1:实现:可以插件化下载皮肤apk,也可以本地存放皮肤apk实现换肤;
2:一次换肤更换所有定义好的控件属性(字体颜色,背景色,背景颜色);
3:不用重重启界面;
4:后台界面控件也会替换,替换界面在子线程操作,不会影响主线程界面操作;
5:下次启动app自动识别上次的主题并加载;

做法是把需要替换的资源文件以相同的名字打包成一个apk,在加载每个布局时通过LayoutInflactFactory 把需要当前界面换肤的控件跟需要替换的属性类别保存起来,当点击换肤时通过反射方式获取到打包好的资源文件里的Res,在通过之前保存好需要替换的控件已经属性集合把里面的控件已经属性全部替换一遍;

难点:
1:如何获取apk的res 对象?
通过反射获得AssetManager ,通过contex.getResources获得必要参数 追new Resources,

2:如何获取所有控件需要替换的属性?怎么区分系统控件跟自定义控件?
通过 LayoutInflactFactory 重写oncreView 方法 在里面通过参数AttributeSet 判断是 背景,颜色等保存到map中,系统控件回调参数name不带前缀createView 时需要手动添加前缀,自定义控件以全类名返回会带”.”;系统控件在createView 时必须加上前缀 “android.widget.”, “android.view.”,”android.webkit.” 循环查找找到结束;

3:如何切换回当前主题,或者说怎么获得默认需要替换的res(需要替换的资源一般只有少数)
4:如何一次性替换所有的界面的控件?
广播

效果图:
这里写图片描述
demo :里面有2个项目,一个是主项目app,一个是皮肤项目里面是需要更换主题的资源文件,需要更换什么资源文件可以在两个项目定义好,把skin编译跟apk放到主工程assets目录.
http://download.csdn.net/detail/lqb3732842/9803650

猜你喜欢

转载自blog.csdn.net/lqb3732842/article/details/66476180