Android实现apk插件方式换肤

换肤思路:

1.什么时候换肤?

xml加载前换肤,如果xml加载后换肤,用户将会看见换肤之前的色彩,用户体验不好。

2.皮肤是什么?

皮肤就是apk,是一个资源包,包含了颜色、图片等。

3.什么样的控件应该进行换肤?

包含背景图片的控件,例如textView文字颜色。

4.皮肤与已安装的资源如何匹配?

资源名字匹配

步骤:

1.xml加载前换肤,意味着需要将所需要换肤的控件收集起来。因此要监听xml加载的过程。

 1 public class BaseActivity extends Activity {
 2
 3     SkinFactory skinFactory;
 4
 5     @Override
 6     protected void onCreate(@Nullable Bundle savedInstanceState){
 7         super.onCreate(savedInstanceState);
 8
 9         //监听xml生成的过程
10         skinFactory = new SkinFactory();
11         LayoutInflaterCompat.setFactory(getLayoutInflater(),skinFactory);
12     }
13 }

2.需要换肤的控件收集到一个容器中并且不更改自己的逻辑直接换肤(例如:不用在每个需要换肤的空间里面加上: “ app:...... ”  自定义控件属性)

思考:

(1)安装的apk的id与皮肤id是否一样?

(2)图片的资源、颜色资源都对应R自动生成的id

(3)皮肤包的资源id、R文件的资源id以及app里R文件的资源的id是否是一样的?——是不一样的

3.一个activity有多个控件(SkinView) 一个控件对应多个换肤属性(SkinItem)

SkinItem来封装这些值:

  • attrName-属性名(background)
  • attrValue-属性值id 十六进制(@color/colorPrimaryDark)
  • attrType--类型(color)
  • Id(R文件的id)
 1 class SkinItem{
 2         // attrName   background
 3         String attrName;
 4
 5         int refId;
 6         // 资源名字  @color/colorPrimaryDark
 7         String attrValue;
 8         //  drawable color
 9         String attrType;
10
11         public SkinItem(String attrName, int refId, String attrValue, String attrType) {
12             this.attrName = attrName;
13             this.refId = refId;
14             this.attrValue = attrValue;
15             this.attrType = attrType;
16         }
17
18         public String getAttrName() {
19             return attrName;
20         }
21
22         public int getRefId() {
23             return refId;
24         }
25
26         public String getAttrValue() {
27             return attrValue;
28         }
29
30         public String getAttrType() {
31             return attrType;
32         }
33     }

SkinView:

1 class SkinView{
2         private View view;
3         private List<SkinItem> list;  //收集需要换肤的集合
4
5         public SkinView(View view, List<SkinItem> list) {
6             this.view = view;
7             this.list = list;
8         }
9     }

4.收集完毕后,应用换肤 (xml加载过程中换肤)

创建SkinManager去获得皮肤apk,app通过SkinManager获取皮肤apk

(1)加载皮肤包(loadSkin):通过反射获得AsserManager的addAssetpath()方法,再通过这个方法获得皮肤apk,从而实例化skinResource;再通过PackageManager.getPackageArchiveInfo(path,PackageManager.GET_ACTIVITIES).packageName;获得皮肤包名

(2)获取颜色(getColor):判断skinResource是否为空;拿到res的名字,eg:通过“colorAccent”去寻找id

原文地址:https://www.cnblogs.com/jiani/p/11644608.html

时间: 2024-08-03 20:43:27

Android实现apk插件方式换肤的相关文章

插件式换肤框架搭建 - 资源加载源码分析

1. 概述 大部分控件我们都会使用,但是我们未必知道其资源加载的原理,目前换肤的框架比较多我们可以随随便便拿过来用,但早在几年前这些资料是比较少的,如果想做一个换肤的框架那就只能自己一点一点啃源码. 如果说我们现在不去用第三方的开源框架,要做一个换肤的功能,摆在我们面前的其实只有一个问题需要解决,那就是如何读取另外一个皮肤apk中的资源. 所有分享大纲:2017Android进阶之路与你同行 视频讲解地址:http://pan.baidu.com/s/1bC3lAQ 2. 资源加载源码分析 2.

Android:Apk插件出现Permission Denial: starting Intent错

Android跳转插件时出现Permission Denial错误主要错误是:在入口Activity中没有添加<action android:name="android.intent.action.MAIN" />. <activity android:name="Activity">     <intent-filter>         <action android:name="android.intent.

Android通过Apk插件调起微信支付

App对接微信调起微信支付需要在微信平台注册,鉴别的标识就是App的包名,所以将申请的包名单独打包成一个Apk文件,则在其他的App调起此Apk的时候同样可以起到调用微信支付的功能.这样就实现了调起微信支付的SDk的功效.操作实现中要将Apk文件安放在assets文件夹的目录下. 当安装好App之后,要将Apk文件保存到本地中 代码实现如下: private boolean saveApk() throws Exception { /** 首先默认个文件保存路径 */ sdcard = Envi

教程: Android应用如何实现换肤功能

本节课程的目的:学会换肤的方案及实现,掌握不同换肤方案的优缺点及适用场合. 希望各位同学做到:学习某一个技巧就掌握透彻,多练习.最好举一反三.触类旁通,掌握分析问题解决问题的思路和方法. 我讲解的是原理以及实现的关键技术点,细节.优化及与课程主题不相关的或初级的内容可能不会讲解.这是免费培训,精力有限,暂时只能做到让普通的变优秀,让优秀的变卓越.你要是已经卓越了来教教我吧.暂时不做入门培训. 国内有很多的软件都支持皮肤定制,这也是与国外软件重大不同之一,国外用户注重社交.邮件等功能,国内用户则重

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

更换皮肤的方式有很多种,有更换背景图片的(图片来源于程序资源文件.sdCard.网络下载).有更换theme样式的.也有apk的等等. 用apk的方式更换程序皮肤,这样的方式,方便,简单,而且使主程序的apk包较小. 先下载皮肤apk包,安装,然后使现在的程序读取新安装的apk包中的资源文件,下次再打开程序时,依旧读取的是上次设置的apk的资源,如果主题apk被卸载,那么就读取的是默认的资源. 核心代码(完整代码见项目压缩包)如下: 主程序: 读取已经安装了的皮肤包的包名.应用图标和应用名称,当

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

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

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

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

Android插件化的思考——仿QQ一键换肤,思考比实现更重要!

Android插件化的思考--仿QQ一键换肤,思考比实现更重要! 今天群友希望写一个关于插件的Blog,思来想去,插件也不是很懂,只是用大致的思路看看能不能模拟一个,思路还是比较重要的,如果你有兴趣的话,也可以加群:555974449,你也可以说出你想看的Blog哦,嘿嘿!好的,不多说,我们进入正题: 关于QQ的换肤,他们的实现思路我不是很清楚,但是你可以看一下这张换肤的截图 我们想使用哪个主题就直接下载就好了,这一实现的过程我们大致的可以猜想: 首选是下载到本地指定文件夹,然后通过插件加载到我

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

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