После перехода на AndroidX android: кнопка не учитывается для API ниже 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" /> 

Для проверенных / непроверенных у меня есть два разных изображения.

После перехода на AndroidX изображение по умолчанию для Android на устройствах ниже API 21.

Что я уже пробовал:

  • изменить CheckBox на AppCompatCheckbox (из AndroidX) - ничего не изменилось
  • установить фон на флажок и установить android:button="@null" - фон в порядке, но я все еще вижу изображение по умолчанию на фоне (см. изображение ниже)

Кажется, что Android полностью неуважение button приписывать.

У меня нет идей. Для Lollipop + все работает как надо. Кто-нибудь сталкивался с такой проблемой? Единственное изменение, которое я сделал, это переход на AndroidX:/

0 ответов

В теме appcompat checkBoxStyle ниже API 21 определяется как

    <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 вступает в силу и игнорирует атрибут кнопки.

Чтобы исправить это, атрибут attr 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>

Измените 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" />

Для библиотек 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"
                />
Другие вопросы по тегам