为啥 CheckBox 检查不以编程方式与 Kotlin 一起工作?

Posted

技术标签:

【中文标题】为啥 CheckBox 检查不以编程方式与 Kotlin 一起工作?【英文标题】:Why CheckBox checked not working with Kotlin programmatically?为什么 CheckBox 检查不以编程方式与 Kotlin 一起工作? 【发布时间】:2019-08-26 11:26:24 【问题描述】:

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

所以基本上问题是使 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_
    android:layout_
    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_
        android:layout_
        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_
        android:layout_below="@+id/txt_filter_title"
        android:layout_marginTop="@dimen/padd_10"
        android:layout_centerHorizontal="true"
        android:layout_
        android:orientation="horizontal">

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

        <CheckBox
            android:id="@+id/chk_windows"
            android:layout_
            android:layout_
            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_
            android:layout_
            android:textSize="15sp"
            android:text="@string/chk_os_linux" />

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

    </LinearLayout>

    <Button
        android:id="@+id/btn_apply_filter"
        android:layout_
        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_
        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)

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

【问题讨论】:

【参考方案1】:

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

    此问题与 Kotlin 无关,Java 中也出现此问题。 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)

【讨论】:

谢谢伙计,我以为我开始发疯了或其他什么:D 为我解决了它【参考方案2】:

我不相信 kotlin 不支持复选框检查。 在您的情况下,它无法正常工作。 您一定在代码中做了一些乱七八糟的事情,因为我们只能看到代码的平静,不确定您的代码有什么问题。上面的代码很好,否则应该可以工作,请检查您创建复选框的方式。

还要始终使用 kotlin 的最新稳定版本。

【讨论】:

我只使用 XML 创建了复选框,而这些复选框在完整代码中的使用并不多。您需要xml或更多代码供参考吗? 是的更多代码,特别是创建者部分和相同的 xml 声明,将帮助我理解问题。

以上是关于为啥 CheckBox 检查不以编程方式与 Kotlin 一起工作?的主要内容,如果未能解决你的问题,请参考以下文章

为啥 Typescript 不以正确的方式支持函数重载?

为啥浏览器不以保存 cookie 的方式保存 JWT 令牌?

为啥标准库不以无锁方式为 8 字节以下的结构实现 std::atomic?

为啥codeigniter2不以更安全的方式存储csrf_hash,比如session?

区分用户更改 Checkbox.Checked 值还是以编程方式更改

为啥 Vector<String> 在以多线程样式访问它时不以同步方式运行 [重复]