android 换肤(2)——插件式无缝换肤(解析鸿洋大神的换肤流程)

本文介绍了Android侵入式换肤的实现方式,对比了非侵入式换肤的繁琐,详细讲解了侵入式换肤的SkinManager和SkinAttrSupport的改变,特别是BaseSkinActivity中对onCreateView的侵入。尽管侵入式换肤简化了流程,但可能带来的问题是代码可读性下降和潜在的bug风险。作者建议在使用时需谨慎,并赞赏这种创新思路。
摘要由CSDN通过智能技术生成

上一篇我说到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];
    //供反射使用的方
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值