【问题标题】:After migration to AndroidX android:button is not respected for API below Lollipop迁移到 AndroidX 后,Lollipop 下的 API 不支持按钮
【发布时间】:2019-09-02 00:02:59
【问题描述】:

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

<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 属性。

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

【问题讨论】:

  • 快速浏览一下源代码,AppCompatCheckbox 似乎使用了buttonCompat 属性。顺便说一句,这将在您的应用程序的命名空间中;即xmlns:app="http://schemas.android.com/apk/res-auto"app:buttonCompat="@drawable/clipboard_checkbox"
  • 实际上,现在我再看一遍,如果buttonCompat 不存在,它应该回退到常规的button 属性。如果可以可靠地重现,那可能是一个错误。
  • ^ 我会在大约 1 小时后检查它,我会通知你的! :)
  • 嗯,好的。如果有机会,我稍后也会尝试运行一些测试。
  • 设置 app:buttonCompat 而不是 android:button 有效!谢谢! :D

标签: android checkbox android-checkbox


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    您需要将 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"
                    />
    

    【讨论】:

    • Shivam 的回答对我们有用,谢谢
    【解决方案3】:

    在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>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-07-12
      • 2019-12-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多