如何收集View?
利用Factory2,接管View的实例化流程,内部使用反射进行创建,并记录View的属性。
什么时候收集View?
onCreate 方法中,添加自定义创建View工厂,运行setContentView之后会将运行自定义View工厂进行view的实例化和记录。
如何记录View的属性?
遍历AttributeSet中获取属性,如果遍历的属性为设定好需要换肤的属性,获取对应属性值进行判断。如果#开头为写死,不需要;如果是?或者@开头则获取属性ID值。
插件APK包如何生成?
debug包即可,只有res资源文件。
如何加载插件Apk包资源?
反射调用AssetManager中的addAssetPath ,传入apk包路径,然后调用Resources获取插件包资源,记录路径包地址。
如何记录是否换肤?
SharedPreferences记录,加载插件包后修改为已加载,加载原资源修改为未加载。
如何修改属性?
获取本地资源和插件包资源,获取每个View和已记录的属性名,判断当前是否加载插件包资源来加载对应资源。
自定义View怎么自定义换肤?
自定义View继承一个接口,一键换肤时候判断控件 instanceof,然后调用接口方法,方法再自定义View中实现,并
谁通知谁换肤?如何做到?
换肤管理者【】通知换肤工厂进行换肤,换肤工厂【Observer】通知View进行换肤。
观察者模式。
最大支持SDK版本到(28)
需要用到什么类?
1、 记录状态值的类【SkinPreference】
2、 记录View和属性值的类【SkinAttribute】
3、 保存类和属性值的类【SkinView、SkinPair】
4、 继承Factory2,创建View的类【SkinLayoutInflaterFactory】
5、 生命周期类,用于加载某界面时候进行view记录的类【SkinActivityLifecycle】
6、 管理换肤功能和状态值的类【SkinManager】
7、 自定义View用于换肤的接口【SkinViewSupport】
8、 获取资源内容的类【SkinResources】
9、 状态栏变化的类【SkinThemeUtils】