После перехода на android android android: кнопка не учитывается для API ниже Lollipop

#android #checkbox #android-checkbox

#Android #флажок #android-флажок

Вопрос:

У меня очень простой флажок:

 <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 я вижу изображение по умолчанию для Android на устройствах ниже API 21.

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

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

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

пример фона, для которого установлено значение img, а для кнопки - значение null

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

Комментарии:

1. При беглом взгляде на источник, похоже AppCompatCheckbox buttonCompat , вместо этого используется атрибут. Кстати, это будет в пространстве имен вашего приложения; т.е. , xmlns:app="http://schemas.android.com/apk/res-auto" , app:buttonCompat="@drawable/clipboard_checkbox" .

2. На самом деле, теперь, когда я снова смотрю, он должен вернуться к обычному button атрибуту, если buttonCompat его там нет. Это может быть ошибкой, если она надежно воспроизводима.

3. ^ Я проверю это примерно через 1 час и дам вам знать! 🙂

4. Хм, хорошо. Я постараюсь позже запустить несколько тестов, если у меня будет такая возможность.

5. Настройка app:buttonCompat вместо android:button сработала! Спасибо! : D

Ответ №1:

В теме appcompat стиль флажка ниже 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 имеет значение по умолчанию для отображения анимации щелчка. Attr buttonCompat вступает в силу и игнорирует кнопку attr.

Чтобы исправить это, значение 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>
  

Ответ №2:

Измените флажок на 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" />
  

Ответ №3:

Вам необходимо установить для button и buttonCompat null для библиотек androidx. Это будет выглядеть следующим образом-

  <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"
                />
  

Комментарии:

1. Ответ Шивама — тот, который сработал для нас, спасибо