记录项目迁移到androidx的一个坑
androidx是goggle对support包进行了整合的一个库,用来替代support,而google也会逐步放弃对support库的升级和维护,所以我们项目再不久前就进行了迁移。
androidx由于刚推出不久,当然也有一些无可避免的坑,这不,今天用低版本的手机(android4.4)一运行,发现所有的checkbox自带的按钮都显示出来了,在xml中是用"android:button=null"竟然不起作用了!
![](https://i-blog.csdnimg.cn/blog_migrate/fc96d5ba899c0ff95a5060dfac40127b.jpeg)
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,现在我们给最后一个多选框改一下,来看下效果:
果不其然,是这个默认属性搞的鬼,可是项目中那么多地方使用了checkbox,我们不可能为了适配一个低级版本的手机,就大张旗鼓的都挨个改吧,那么继续来看这个属性的实现,全局搜索一下这个属性吧
注意要选择Scope域,全局搜,我们可以看到出现了这么多使用到的地方,自然是要看androidx依赖的资源了(如图),点进去看看:
可以看到,这里有两个文件,我们是android4.4系统,所以要跟踪第一个文件:
可以看到,这里有3个属性,button属性我们在xml里面设置了,这里还有一个buttonCompat属性?看它的值,应该是设置checkbox动画的,是不是这里的原因呢,那我们在全局的style里面设置一下,给它覆盖掉试试吧!
我们在AppTheme中添加这个属性,我这里把background也覆盖掉了,这样在点击的时候就没有阴影了,看看运行效果:
![](https://i-blog.csdnimg.cn/blog_migrate/5160992a496b63d2bf458198b48f6078.jpeg)
果然可以了,个人猜测,可能是因为设置了这个动画,androidx实现的时候不管你有没有设置button,都会给你默认加个框来完成它的动画。
总结
上面我们看到 有个v21的资源文件,所以这个问题在android5.0以下就会出现了,大家可以试试。这里需要注意的是,这两种实现原理都是一样的,覆盖了它默认的Style,所以再使用android:button这个属性的时候就会失效,所以建议大家使用drawableLeft或drawableRight或background来实现选中效果。
总之,项目迁移到androix肯定还有很多坑,只有一点一点来发现问题手动去适配了