上一篇我说到tag式换肤的流程。
小结:
你只需要在每一个需要换肤的activity中注册SkinManager就可以换肤了,并且在需要换肤的资源中xml或者代码中都要设置tag,且这个tag是严格按格式来的。
这就是非侵入是换肤:对程序的影响最小,但是很麻烦,你要为每一个需要换肤的资源配置tag。
所以,侵入式换肤解决的就是这个问题。你在也不用注册SkinManager了,也不用在每个属性中都加入格式繁琐的tag了。
对于侵入式来说,你只需要规范的命名你的资源id就ok了。
接下来我们看看侵入式的换肤。
侵入式换肤的SkinManager没有了注册和反注册方法,其他的差不多。这里就不贴出来了,如果想要了解的,在(1)中已经给出了鸿洋大神的项目地址,自己可以去看。
而侵入式换肤调用的SkinAttrSupport中的getSkin方法并不再是“getSkinTags(String tag)”了。而是“getSkinAttrs(AttributeSet attrs, Context context)”。
可以看到,我们只需要传入view的资源集AttributeSet和上下文就ok。已经脱离了tag。
该方法我在(1)中也贴出来了,这里就不再贴出来了。
侵入式换肤最主要的方法在于baseSkinactivity中:
这是鸿洋大神的BaseSkinActivity。侵入了onCreateView方法,使用了视图兼容工厂。
这里面如何侵入的,我只能看看,解释的可能也有出入。
**
* 如果需要换肤的activity就要继承该activity
* 该activity实现了ISkinListener接口,可以为换肤提供一个标识
* 实现LayoutInflaterFactory是换肤的主要方法
*/
public class BaseSkinActivity extends AppCompatActivity implements ISkinListener, LayoutInflaterFactory {
//构造函数
private static final Class<?>[] sConstructorSignature = new Class[]{Context.class, AttributeSet.class};
//构造函数的集合
private static final Map<String, Constructor<? extends View>> sConstructorMap = new ArrayMap<>();
//构造函数参数,长度为2
private final Object[] mConstructorArgs = new Object[2];
//供反射使用的方