动态换肤
2022-06-06 本文已影响0人
carlwu_186
- 写一个只包含皮肤资源信息的apk包,资源名称和换肤应用名称保持一致。
- 换肤应用在
setContentView
方法内完成的View加载,它内部调用了LayoutInflater.inflate
,内部又用到了Factory2.onCreateView
来创建所有的View对象,所以思路就是自己实现一个Factory2
反射设置给系统层。 - 在
Factory2.onCreateView
实现时,就可以从换肤apk包中读取出新的资源内容,设置给View对象。 - 如何将皮肤包加载到应用内?使用
AssetManager
类,反射无参构造方法得到实例,调用它的addAssetPath
传入apk包的路径,再把AssetManager
实例作为参数得到Resources
对象。 - 如何将应用中要替换资源的ID同皮肤包中的资源ID映射转换?
Factory2.onCreateView
时有一个参数AttributeSet
,它包含了要创建的View指定了的属性信息,包含attributeName
、resId
,可以使用通过应用自己的Resources
传入参数resId
拿到resName
、resType
。可以通过皮肤包的Resources
对象,拿到任何想要的资源内容(参数有两个:resName
、resType
),然后根据resType
手动调用Java代码替换View的属性值。