Android RadioButton、CheckBox、Switch在低于API 21机器上显示异常,button设置为null无效(AndroidX升级导致)
测试突然提了一个机型兼容的BUG,在4.4的某个华为机器上RadioButton显示异常,查看其他页面,发现CheckBox也出现同样问题。
下面截了个图:
在这个设备上突然出现了黑色圆圈,这是radiobutton原始的样式,checkbox也是出现了系统默认的样式;
不耽误大家时间,先说结论和办法,然后在分析一下:
问题原因是升级到AndroidX导致的在API21以下的机型会出现,测试了几个出现的都是华为的设备。
但是androidx1.0.0是正常的,androidx1.1.0的问题;
解决办法:
1、第一种办法:
在你xml使用<RadioButton>时不光要添加
android:button=‘@null’;
还要添加一个:
app:buttonCompat=‘@null’
就好了;
2、第一种方式每一处使用都需要添加,如果觉得不太好想统一处理就就考虑第二和第三种
第二种就是自定义radiobutton,看下radiobutton的构造函数源码:
可以看到两个参数的构造,默认传了个样式,我们自定义的时候将这个参数传0即可;
同理checkbox、switch和radiobutton一样都继承CommpoundButton,看源码都是一样的问题;
3、第三种
在AppTheme里加入如下代码:
全局设置buttonCompat为空,至于为什么下面分析下;
注意:加入apptheme可以,但是如果你使用radiobutton、checkbox、switch的activity如果设置了自己的style的化,你可以加在activity的style里,避免覆盖导致设置无效;
下面就简单分析下问题根源:
首先进入源码看见了两参的构造函数,他默认传了一个style,那就去找一下这个style在哪里:
你可以直接按照下面图片方法找,也可以直接全局搜radiobuttonstyle直接定位到values中;
在项目的External Libraries展开找到appcpmpat
展开之后res --> values
打开之后搜索radiobuttonstyle
找到了buttoncompat
这个样式在androidx1.0.0中
就没有buttoncompat;
问题就在这里,他默默这个属性之后你光设置buton=null是不行的,还要把buttoncompat带上一起null才行;
至于为什么1.1.0版本就会多了这个属性,emmmmmmm.............未完待续;