效果图:

简介

经过上篇的介绍(https://editor.csdn.net/md/?articleId=106350257),其实换肤的操作十分简单,简单的说就是A模式调用A资源文件,B模式调用B资源文件,C模式调用C资源文件,以此类推而已。

这个资源文件,其实就是皮肤包,直接开撸

资源文件包(皮肤包)

首先是资源文件包,它是资源文件,所以它仅仅有一些资源而已,没有代码。这些资源可以自定义。(但是资源名字要与主项目的资源名字一致)
然后build成apk文件后,就可以改成喜欢的名字,比如xx.skin,然后放入内置存储卡中:storage/emlated/0/

demo地址:https://github.com/lyx19970504/Dynamic-Skin-Change/tree/skinPackage

接着就是在代码中”拿出“这个资源文件包,然后解析并获取里面的资源,设置。

主项目APK

SkinManager.java

1、loadSkinResource(加载资源文件)

private static final String ADD_ASSETS_PATH = "addAssetPath";AssetManager assetManager = AssetManager.class.newInstance();Method addAssetsMethod = assetManager.getClass().getDeclaredMethod(ADD_ASSETS_PATH, String.class);addAssetsMethod.setAccessible(true);addAssetsMethod.invoke(assetManager, skinPath);skinResource = new Resources(assetManager, appResource.getDisplayMetrics(), appResource.getConfiguration());skinPackageName = application.getPackageManager().getPackageArchiveInfo(skinPath, PackageManager.GET_ACTIVITIES).packageName;

首先需要通过AssetManager的addAssetPath方法将资源包的路径进行设置,由于addAssetPath方法是@hide注解,因此需要通过反射来完成,并且compileSdkVersion的版本和targetSdkVersion最大只能是28,29的话会出错。然后通过assetManager来生成skinResource对象,通过这个对象就可以得到资源包的所有资源文件。并通过路径获取资源包的PackageName.

2、获取资源的id

首先做个约定:本地apk的资源名称与路径与皮肤包的资源名称路径相同。
然后将主项目的apk拖到android studio中,会有一个叫resources.arsc的文件,它保存了所有的资源的id、文件名、路径的一一关系映射表:

然后在项目资源包的apk拖到android studio中,打开resources.arsc的文件看看:

可以发现他们的ID值一模一样!他们有相同的文件名,相同的文件路径。这样一来,如果想要获取资源apk中的资源文件,那么可以先通过本地资源的ID去获取它的名字,类型,因为这些信息跟资源包中的文件是一一对应的,代码如下:

private int tryGetSkinResourceId(int originResourceId) {if (isDefaultSkin) {return originResourceId;}/*** 因为app的资源文件名称与皮肤包中的文件名称相同,因此名称和id也会相同*/Log.d(TAG, "originResourceId: " + originResourceId);String resourceName = appResource.getResourceEntryName(originResourceId);String resourceType = appResource.getResourceTypeName(originResourceId);int skinResourceId = skinResource.getIdentifier(resourceName, resourceType, skinPackageName);Log.d(TAG, "skinResourceId: " + skinResourceId);isDefaultSkin = skinResourceId == 0;return skinResourceId == 0 ? originResourceId : skinResourceId;}

首先判断是否点击的是默认按钮,是的话那就不在获取资源文件。然后根据本地资源的ID获取资源的名字、类型,再根据这个名字、类型在皮肤资源包中寻找对应的资源ID,找到的话就可以返回并设置了。

demo地址:https://github.com/lyx19970504/Dynamic-Skin-Change/tree/DynamicSkinFromResource

资源包地址:https://github.com/lyx19970504/Dynamic-Skin-Change/tree/skinPackage

Android换肤:从外存中读取皮肤包资源实现换肤相关推荐

  1. 打包部署后无法读取jar包里的文件(实测可行,Java中读取jar包中的文件)

    打包部署后无法读取jar包里的文件 Java中读取jar包中的文件 linux中无法读取jar包中的内容(windows可以的!),如何解决 一.背景 项目中免不了需要读取文件,如果文件用绝对路径读取 ...

  2. android 从assets和res中读取文件(转)

    1. 相关文件夹介绍 在Android项目文件夹里面,主要的资源文件是放在res文件夹里面的.assets文件夹是存放不进行编译加工的原生文件,即该文件夹里面的文件不会像xml,java文件被预编译, ...

  3. Android从assets和res中读取文件

    1. 相关文件夹介绍 在Android项目文件夹里面,主要的资源文件是放在res文件夹里面的.assets文件夹是存放不进行编译加工的原生文件,即该文件夹里面的文件不会像xml,java文件被预编译, ...

  4. Android从assets和raw中读取txt文件

    方法一.将要读取的txt文件拷贝到Android工程目录下的assets文件夹下 方法二.在res文件夹下新建raw文件夹,将txt拷贝到该目录下 本方法是从assets中读取 /*** 从asset ...

  5. 读取jar包资源代码赏析

    2019独角兽企业重金招聘Python工程师标准>>> 该代码来自jfinal engine.读取jar包内代码通常通过classLoader获取 // // Source code ...

  6. Android 在build.gradle文件中读取json文件

    1.在build.gradle中加入读取1.json文件代码,放在android{}外面 String str = ""try {File file = new File(&quo ...

  7. android 读取资源中的文件下载,android – 从APK扩展文件中读取内容(来自obb文件)...

    我已经实现了APK扩展文件下载服务,全部来自 http://developer.android.com/google/play/expansion-files.html 我可以下载APK扩展文件,我可 ...

  8. android 获取nfc,Android:在服务类中读取NFC标签

    我正在开发一个应用程序,我需要读取存储在NFC标签中的数据,通过数据我的意思是简单的整数值,如0,1,2,3等. 从NFC读取数据的function在Activity类中工作正常但我需要在后台运行应用 ...

  9. WinPcap笔记(10):从堆文件中读取数据包

    上一讲将数据包保存在堆文件中,现在,我们就可以读取它了.可以通过pcap_open_offline()函数将堆文件打开.函数具体格式如下: pcap_t* pcap_open_offline ( co ...

最新文章

  1. (IOS)签名Demo
  2. 飞象求职学python_用Python制作markdown编辑器
  3. ASCII码对照表 转帖
  4. opencv图像处理9-图像金字塔
  5. heap与stack区别
  6. 手机html left 50%,left-​50%是什么意思
  7. c 中oracle连接字符串,Oracle连接字符串C#
  8. c语言迷宫游戏怎么存放坐标,求解迷宫问题(c语言,很详细哦
  9. C# 匿名方法及Lambda表达式
  10. AcWing 868. 筛质数(欧拉筛模板)
  11. 遇到Python中文目录名问题,未解决
  12. A[1054] The Dominant Colour (map!!)
  13. CSS综合案例——淘宝焦点图(轮播图)布局及网页布局总结
  14. 推荐几款强大流行的BI系统
  15. Web项目 引入Editormd
  16. boost电路公式详解
  17. 视频网站盈利模式与营销策划
  18. HTML+CSS基础学习笔记2
  19. 海康摄像头尾部网线端口线序
  20. 数据库连接池,几种开源的数据库连接池

热门文章

  1. 帝国理工计算机科学硕士,帝国理工计算机硕士介绍
  2. linux编译curses报错,linux屏幕编程:curses库的使用
  3. 高效办公,这5款工具你不该错过
  4. HD Tune Pro
  5. 一只互联网市场狗的合租房“中介”生涯
  6. Spring Cloud 优雅下线以及灰度发布
  7. xycms登录后台详细教程(php+mysql)
  8. hijackthis日志祥解
  9. 倩女幽魂降魔传奇java上的_新倩女幽魂京城妖奇谈任务流程攻略
  10. java tair,Tair 简介