android - 迁移到 AndroidX android :button is not respected for API below Lollipop 后

标签 android checkbox android-checkbox

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

<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 后,我在低于 API 21 的设备上看到 Android 的默认图像。

我已经尝试过:

  • 将 CheckBox 更改为 AppCompatCheckbox(来自 AndroidX) - 没有任何变化
  • 将背景设置为复选框并设置android:button="@null" - 背景没问题,但我仍然在背景上看到默认图像(见下图)

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

example of background set to img and button to null

我没有主意了。对于 Lollipop+ 来说,一切都按其应有的方式运作。有人遇到过这样的问题吗? 我所做的唯一改变是迁移到 AndroidX :/

最佳答案

在appcompat主题中,API 21下面的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 有一个默认值来显示点击动画。 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>

关于android - 迁移到 AndroidX android :button is not respected for API below Lollipop 后,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55631014/

相关文章:

android - 如何在使用 Android 中的自定义数组适配器在 ListView 中使用复选框选中后删除多个项目?

android - 警报对话框上带有多选复选框的列表?

android - 如何在 Android 中从 XML 更改按钮的文本颜色?

android - 支持 native 移动应用程序中的 ASP.Net Forms 身份验证

android - IllegalStateException 调用 MediaPlayer.reset()

html - 在同一行显示标签和滑动复选框

javascript - Angularjs 应用程序中文本框和复选框模型中触发跨度单击和观看事件序列的冲突

Android 在过滤 ListView 时未选中复选框

android - AppCompatCheck 框在 android 4.3 API 18 中不可见

android - 工具栏和 TabLayout 在 Android 4.4 设备上不可见