项目迁移到Androidx,在低版本手机运行时,Checkbox设置button为null不起作用

记录项目迁移到androidx的一个坑

        androidx是goggle对support包进行了整合的一个库,用来替代support,而google也会逐步放弃对support库的升级和维护,所以我们项目再不久前就进行了迁移。

        androidx由于刚推出不久,当然也有一些无可避免的坑,这不,今天用低版本的手机(android4.4)一运行,发现所有的checkbox自带的按钮都显示出来了,在xml中是用"android:button=null"竟然不起作用了!

项目迁移到Androidx,在低版本手机运行时,Checkbox设置button为null不起作用_第1张图片

what?这是什么鬼?布局文件里面是都设置了android:button="@null"的,好吧,从源码入手,我们来看看checkbox的源码:

public class CheckBox extends CompoundButton {
        public CheckBox(Context context) {
            this(context, null);
        }
    
        public CheckBox(Context context, AttributeSet attrs) {
            this(context, attrs, com.android.internal.R.attr.checkboxStyle);
        }
    
        public CheckBox(Context context, AttributeSet attrs, int defStyleAttr) {
            this(context, attrs, defStyleAttr, 0);
        }
    
        public CheckBox(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
            super(context, attrs, defStyleAttr, defStyleRes);
        }
    
        @Override
        public CharSequence getAccessibilityClassName() {
            return CheckBox.class.getName();
        }
}

上面可以看到,第二个构造参数里,设置了一个默认的checkboxStyle,这或许就是那个罪魁祸首呢,我们来自定义一个:

class CommonCheckbox @JvmOverloads constructor(
        context: Context, attrs: AttributeSet? = null, defStyleAttr: Int = 0
) : CheckBox(context, attrs, defStyleAttr)

这样我们就绕过了defStyleAttr,默认成了0,现在我们给最后一个多选框改一下,来看下效果:项目迁移到Androidx,在低版本手机运行时,Checkbox设置button为null不起作用_第2张图片

果不其然,是这个默认属性搞的鬼,可是项目中那么多地方使用了checkbox,我们不可能为了适配一个低级版本的手机,就大张旗鼓的都挨个改吧,那么继续来看这个属性的实现,全局搜索一下这个属性吧
项目迁移到Androidx,在低版本手机运行时,Checkbox设置button为null不起作用_第3张图片
注意要选择Scope域,全局搜,我们可以看到出现了这么多使用到的地方,自然是要看androidx依赖的资源了(如图),点进去看看:

可以看到,这里有两个文件,我们是android4.4系统,所以要跟踪第一个文件:
在这里插入图片描述
可以看到,这里有3个属性,button属性我们在xml里面设置了,这里还有一个buttonCompat属性?看它的值,应该是设置checkbox动画的,是不是这里的原因呢,那我们在全局的style里面设置一下,给它覆盖掉试试吧!
项目迁移到Androidx,在低版本手机运行时,Checkbox设置button为null不起作用_第4张图片
我们在AppTheme中添加这个属性,我这里把background也覆盖掉了,这样在点击的时候就没有阴影了,看看运行效果:

项目迁移到Androidx,在低版本手机运行时,Checkbox设置button为null不起作用_第5张图片

果然可以了,个人猜测,可能是因为设置了这个动画,androidx实现的时候不管你有没有设置button,都会给你默认加个框来完成它的动画。

总结

        上面我们看到 有个v21的资源文件,所以这个问题在android5.0以下就会出现了,大家可以试试。这里需要注意的是,这两种实现原理都是一样的,覆盖了它默认的Style,所以再使用android:button这个属性的时候就会失效,所以建议大家使用drawableLeft或drawableRight或background来实现选中效果。

        总之,项目迁移到androix肯定还有很多坑,只有一点一点来发现问题手动去适配了

你可能感兴趣的:(移动端,kotlin)