android - 为什么 CheckBox 检查不能以编程方式与 Kotlin 一起使用?

标签 android android-layout kotlin android-checkbox

我认为这个问题以前可能有人问过,但这个问题也发生在我身上,所以我在这里再次询问,看看我们能否找到解决方案。

所以基本上问题是以编程方式检查复选框不与 Kotlin 代码一起工作。为了解释一下,我正在分享我的代码和问题的屏幕截图。

     //filterContraints is ArrayList<Integer> type

     if(filterContraints!!.size > 0){

        filterContraints!!.forEach {

        Log.d(TAG, "For each filter constraints : $it")
        if(it == AppConstants.MAC_OS && !chkMacOS!!.isChecked)
        {
           chkMacOS!!.isChecked = true
        }
        if(it == AppConstants.WINDOWS_OS && !chkWindows!!.isChecked)
        {
           chkWindows!!.isChecked = true
        }
        if(it == AppConstants.LINUX_OS && !chkLinux!!.isChecked)
        {
           chkLinux!!.isChecked = true
        }
        if(it == AppConstants.ALL_OS && !chkAllOs!!.isChecked)
        {
           chkAllOs!!.isChecked = true
        }
      }
   }

这是整个布局的 xml :

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:id="@+id/bottom_sheet"
    android:layout_width="match_parent"
    android:layout_height="200dp"
    android:background="@android:color/white"
    android:clickable="true"
    android:clipToPadding="false"
    android:fitsSystemWindows="true"
    app:behavior_hideable="true"
    app:behavior_peekHeight="0dp"
    app:layout_behavior="@string/bottom_sheet_behavior">

    <TextView
        android:id="@+id/txt_filter_title"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_gravity="center"
        android:gravity="center"
        android:textColor="@color/darkestGrey"
        android:layout_marginTop="@dimen/padd_10"
        android:text="@string/txt_filter_payload"
        android:fontFamily="sans-serif-medium"
        android:textStyle="bold"
        android:textSize="18sp" />


    <LinearLayout
        android:id="@+id/row_filter_categories"
        android:layout_width="wrap_content"
        android:layout_below="@+id/txt_filter_title"
        android:layout_marginTop="@dimen/padd_10"
        android:layout_centerHorizontal="true"
        android:layout_height="wrap_content"
        android:orientation="horizontal">

        <CheckBox
            android:id="@+id/chk_mac"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:textSize="15sp"
            android:text="@string/chk_os_mac" />

        <CheckBox
            android:id="@+id/chk_windows"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginStart="@dimen/padd_10"
            android:layout_marginEnd="@dimen/padd_10"
            android:textSize="15sp"
            android:text="@string/chk_os_windows" />

        <CheckBox
            android:id="@+id/chk_linux"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:textSize="15sp"
            android:text="@string/chk_os_linux" />

        <CheckBox
            android:id="@+id/chk_all_os"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:textSize="15sp"
            android:textAllCaps="false"
            android:text="@string/chk_os_all" />

    </LinearLayout>

    <Button
        android:id="@+id/btn_apply_filter"
        android:layout_width="wrap_content"
        android:layout_below="@+id/row_filter_categories"
        android:layout_marginTop="@dimen/activity_vertical_margin"
        android:layout_marginEnd="@dimen/padd_10"
        android:layout_alignParentEnd="true"
        android:gravity="center"
        android:background="@color/colorPrimary"
        android:textColor="@color/white"
        android:layout_height="wrap_content"
        android:textSize="15sp"
        android:text="@string/txt_apply_filter" />

</RelativeLayout>

这是 Kotlin 中的声明部分:

    private var chkMacOS: CheckBox? = null
    private var chkWindows: CheckBox? = null
    private var chkLinux: CheckBox? = null
    private var chkAllOs: CheckBox? = null

这里是检索部分:

    chkMacOS = fragmentView.findViewById(R.id.chk_mac)
    chkWindows = fragmentView.findViewById(R.id.chk_windows)
    chkLinux = fragmentView.findViewById(R.id.chk_linux)
    chkAllOs = fragmentView.findViewById(R.id.chk_all_os)

这里是输出:看到最后两个复选框,只有边框是彩色的但没有被选中。

enter image description here

最佳答案

好的,我得到答案了。实际上有两个问题,我在寻找解决方案时发现了:

  1. 此问题与 Kotlin 无关,Java 中也会发生这种情况。
  2. setChecked 适用于 Android 5.0,但不适用于 Nougat

以下是我提到的一些引用:

A) Radio Button is only partially checked

B) Android Nougat: Why do checkboxes on Fragment have incomplete state when selected programmatically (but look fine on Lollipop)

这是一个适用于我的两个 Android 版本的解决方案:

chkMacOS!!.post {
    chkMacOS!!.setChecked(true)
    chkMacOS!!.jumpDrawablesToCurrentState() // This is most important 
   }

我希望这可以帮助任何正在寻找类似解决方案的人(谢谢@Nipper)

关于android - 为什么 CheckBox 检查不能以编程方式与 Kotlin 一起使用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55520466/

相关文章:

android - 错误:error: expected float but got (raw string) match-parent

android - 如何在 Android 的 Google Maps API 中使用适应设备像素密度的自定义图 block ?

android - 前台服务在 Android O 的打瞌睡模式下不接收位置更新

android - 构建无版本号后缀的 boost

android - 如何在每一行中有多个 TextView 和 EditText

android - 如何在外部浏览器中打开 Android 应用程序中的链接?

android - 数据绑定(bind)在 fragment 和 Activity 之间表现出意外

android - 我如何测试没有为非模拟对象调用方法?

java - Kotlin 中的注释不起作用

android - 无法构建 Titanium Android 应用程序以在模拟器中进行测试