项目迁移到Androidx,在安卓5.0以下手机运行时,RadioButton设置button为null不起作用

项目迁移到androidx,用低版本的手机(android4.4)测试,发现xml中的用"android:button=null"不起作用了,所有的RadioButton和Checkbox自带的按钮都显示出来了。

查看源码,发现第二个构造参数多了个默认属性

com.android.internal.R.attr.radioButtonStyle

如:RadioButton和AppCompatRadioButton源码(CheckBox和AppCompatCheckBox一样)

RadioButton:

public class RadioButton extends CompoundButton {
    
    public RadioButton(Context context) {
        this(context, null);
    }
    
    public RadioButton(Context context, AttributeSet attrs) {
        this(context, attrs, com.android.internal.R.attr.radioButtonStyle);
    }

    public RadioButton(Context context, AttributeSet attrs, int defStyleAttr) {
        this(context, attrs, defStyleAttr, 0);
    }

    public RadioButton(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
        super(context, attrs, defStyleAttr, defStyleRes);
    }

 AppCompatRadioButton:

public class AppCompatRadioButton extends RadioButton implements TintableCompoundButton,
        TintableBackgroundView {

    private final AppCompatCompoundButtonHelper mCompoundButtonHelper;
    private final AppCompatBackgroundHelper mBackgroundTintHelper;
    private final AppCompatTextHelper mTextHelper;

    public AppCompatRadioButton(Context context) {
        this(context, null);
    }

    public AppCompatRadioButton(Context context, AttributeSet attrs) {
        this(context, attrs, R.attr.radioButtonStyle);
    }

    public AppCompatRadioButton(Context context, AttributeSet attrs, int defStyleAttr) {
        super(TintContextWrapper.wrap(context), attrs, defStyleAttr);
        mCompoundButtonHelper = new AppCompatCompoundButtonHelper(this);
        mCompoundButtonHelper.loadFromAttributes(attrs, defStyleAttr);

        mBackgroundTintHelper = new AppCompatBackgroundHelper(this);
        mBackgroundTintHelper.loadFromAttributes(attrs, defStyleAttr);

        mTextHelper = new AppCompatTextHelper(this);
        mTextHelper.loadFromAttributes(attrs, defStyleAttr);
    }

解决方法一:重新第二个构造方法,把defStyleAttr默认为0(CheckBox原理一样)

public class MyRadioButton extends AppCompatRadioButton {
    public MyRadioButton(Context context, AttributeSet attrs) {
        super(context, attrs,0);
    }
}

然后布局文件使用自定义的RadioButton

解决方法二:设置Style,可以在Application统一设置,项目中所有的就统一更改了(当然也可以每个单独设置)

 <!-- Base application theme. -->
    <style name="AppTheme_white" parent="Theme.AppCompat.Light.NoActionBar">
        <item name="colorPrimary">@color/white</item>
        <item name="colorPrimaryDark">@color/white</item>
        <item name="colorAccent">@color/colorAccent</item>
        <item name="radioButtonStyle">@style/RadioButton_no</item>
        <item name="checkboxStyle">@style/CheckBox_no</item>
    </style>
    <style name="RadioButton_no" parent="Widget.AppCompat.CompoundButton.RadioButton">
        <item name="buttonCompat">@null</item>
        <item name="android:background">@null</item>
    </style>
    <style name="CheckBox_no" parent="Widget.AppCompat.CompoundButton.CheckBox">
        <item name="buttonCompat">@null</item>
        <item name="android:background">@null</item>
    </style>

完美解决!

解决之后

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值