android - Radiobutton drawable 对 state_checked 没有反应

标签 android kotlin radio-button android-drawable

我正在尝试在 RadioButton 中创建一个复选标记,如果未选中该按钮,该复选标记就会消失。但是,如果我将自定义复选标记放在 RadioButtonandroid:button 属性中,它似乎只会对 state_checked 使用react。这是出乎意料的,因为如果我用 android:drawableRight="?android:attr/listChoiceIndicatorSingle" 替换自定义复选标记,这将非常有效。在 drawableRight 中包含复选标记是我的偏好,因为在 android:button 属性上设置间距是有问题的。

是否有不同的设置可以使复选标记按预期运行?

这是当前代码:

<RadioGroup
            android:layout_width="match_parent"
            android:layout_height="wrap_content">

        <RadioButton
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:button="@null"
            android:drawableRight="@drawable/period_selector"
            android:background="?android:selectableItemBackground"
            android:layoutDirection="rtl"
            android:layout_gravity="start"
            android:textAlignment="textStart"
            android:paddingVertical="16dp"
            android:paddingHorizontal="16dp"
            android:text="@string/period_selection_month"
            android:textSize="16sp" />

        <View
            android:layout_width="match_parent"
            android:layout_height="1dp"
            android:background="?divider" />

        <RadioButton
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:button="@null"
            android:drawableRight="@drawable/period_selector"
            android:background="?android:selectableItemBackground"
            android:layoutDirection="rtl"
            android:layout_gravity="start"
            android:textAlignment="textStart"
            android:paddingVertical="16dp"
            android:paddingHorizontal="16dp"
            android:text="@string/period_selection_year"
            android:textSize="16sp" />
</RadioGroup>

drawable/period_selector.xml如下:

<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:drawable="@drawable/ic_check" android:state_checked="true" />
</selector>

总结:

  • 无论是否选中按钮,drawableRight 中的自定义复选标记都不会呈现。
  • drawableRight 中使用标准的 listChoiceIndicatorSingle 可以正确响应按钮是否被选中
  • button 中使用自定义复选标记确实显示出现和消失的预期选择行为,但不听间距

最佳答案

问题

<selector xmlns:android="http://schemas.android.com/apk/res/android"> <item android:drawable="@drawable/ic_check" android:state_checked="true" /> </selector>

您的选择器错过了 RadioButton 的未选中状态, 因此它设置了 drawableRight没有可绘制对象。因此,drawableRight 的默认占用大小为 0。

当你改变按钮状态时进行检查;它试图绘制 ic_check当前保留的大小 drawableRight这是 0;因此您不会看到任何变化。

解决方案

要解决此问题,您需要将选择器的未选中状态指定给某些可绘制对象。

My trials to use @null or to using 0 size, but both fails with exceptions as the drawable is not specified or it's 0 in size.

因此,修复的方法是使用与 ic_check 相同的可绘制对象但有透明电流。

这是 Android Studio 提供的默认勾选标记:

<vector xmlns:android="http://schemas.android.com/apk/res/android"
    android:width="24dp"
    android:height="24dp"
    android:tint="@color/teal_700"
    android:viewportWidth="24"
    android:viewportHeight="24">

    <path
        android:fillColor="@color/teal_700"
        android:pathData="M9,16.17L4.83,12l-1.42,1.41L9,19 21,7l-1.41,-1.41z" 

</vector>

然后创建另一个具有透明颜色的典型文件:ic_check_empty.xml

<vector xmlns:android="http://schemas.android.com/apk/res/android"
    android:width="24dp"
    android:height="24dp"
    android:viewportWidth="24"
    android:viewportHeight="24"
    android:tint="@android:color/transparent">
    <path
        android:fillColor="@android:color/transparent"
        android:pathData="M9,16.17L4.83,12l-1.42,1.41L9,19 21,7l-1.41,-1.41z"/>
</vector>

并将其应用于选择器:

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:drawable="@drawable/ic_check" android:state_checked="true" />
    <item android:drawable="@drawable/ic_check_empty" android:state_checked="false" />
</selector>

旁注:使用 ViewRadioGroup 内将引发异常,因为这里不允许;如果你需要在 RadionButtons 之间添加一个分隔符,那么你可以使用:

<RadioGroup
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:divider="?android:attr/dividerHorizontal"
    android:showDividers="middle"> 

或者你可以看看here for other solutions .

关于android - Radiobutton drawable 对 state_checked 没有反应,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69627675/

相关文章:

android - Android Gradle Kotlin Dsl 中 Unresolved reference 问题

android - 日期选择器无法在 scrollView 中正确滚动

android - RxJava 2 - 列表对象中的过滤器列表

asp.net - 在后面的代码中检查单选按钮时出现问题

php - Jquery Onclick 似乎对我不起作用

html - 具有百分比宽度的容器中的单选按钮伪元素定位问题

java - 辅助功能服务崩溃并且无法重新启动

java - Android Gradle 错误

android - 对象未添加到应用程序类线程内的 ArrayList

android - 数据库查询在尝试获取 LiveData 时抛出 KotlinNullPointerException