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

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

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

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

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,现在我们给最后一个多选框改一下,来看下效果:[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ETanMr0O-1572351079341)(60103292C6964737A07D6AF1F8EA03DB)]

果不其然,是这个默认属性搞的鬼,可是项目中那么多地方使用了checkbox,我们不可能为了适配一个低级版本的手机,就大张旗鼓的都挨个改吧,那么继续来看这个属性的实现,全局搜索一下这个属性吧

注意要选择Scope域,全局搜,我们可以看到出现了这么多使用到的地方,自然是要看androidx依赖的资源了(如图),点进去看看:

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

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

总结

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

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

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

阿烦大大@

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值