#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
атрибут.
У меня нет идей. Для 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. Ответ Шивама — тот, который сработал для нас, спасибо