迁移到 AndroidX 后 android:button 不受 Lollipop 以下 API 的尊重

After migration to AndroidX android:button is not respected for API below Lollipop

我有一个非常简单的复选框:

<CheckBox xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/clipboardBtn"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:button="@drawable/clipboard_checkbox" /> 

对于checked/unchecked,我有两张不同的图片。

迁移到 AndroidX 后,我在 API 21.

以下的设备上看到 Android 的默认图像

我已经尝试过的:

似乎 Android 完全不尊重 button 属性。

我没主意了。对于 Lollipop+,everythink 可以正常工作。有没有人遇到过这样的问题? 我所做的唯一改变是迁移到 AndroidX :/

在appcompat主题中,API21下面的checkBoxStyle定义为

    <style name="Base.Widget.AppCompat.CompoundButton.CheckBox" parent="android:Widget.CompoundButton.CheckBox">
        <item name="android:button">?android:attr/listChoiceIndicatorMultiple</item>
        <item name="buttonCompat">?attr/listChoiceIndicatorMultipleAnimated</item>
        <item name="android:background">?attr/controlBackground</item>
    </style>

attr buttonCompat 有一个默认值来显示点击动画。 buttonCompat属性生效,忽略按钮属性。

要修复它,属性 buttonCompat 必须未定义。在您的主题中添加

    <item name="checkboxStyle">@style/MyCheckBox</item>

并添加样式

    <style name="MyCheckBox" parent="android:Widget.CompoundButton.CheckBox">
        <item name="android:button">?android:attr/listChoiceIndicatorMultiple</item>
        <item name="buttonCompat">@null</item>
        <item name="android:background">?attr/selectableItemBackgroundBorderless</item>
    </style>

同样在您的 values-v21 目录中,将其添加到您的主题中

    <item name="checkboxStyle">?android:attr/checkboxStyle</item>

您需要为androidx 库设置button 和buttonCompat null。它看起来像下面-

 <androidx.appcompat.widget.AppCompatCheckBox
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:button="@null"
                app:buttonCompat="@null"
                android:background="@drawable/cb_pause_resume_selector"
                />

将 CheckBox 更改为 AppCompatCheckBox(AndroidX) 并将 android:button 替换为 app:buttonCompat

  <androidx.appcompat.widget.AppCompatCheckBox
    android:id="@+id/clipboardBtn"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    app:layout_constraintEnd_toEndOf="parent"
    app:layout_constraintHorizontal_chainStyle="packed"
    app:layout_constraintStart_toStartOf="parent"
    app:layout_constraintTop_toBottomOf="@+id/email_sign_in_button"
    app:buttonCompat="@drawable/clipboard_checkbox" />