Deep Shah
Deep Shah

Reputation: 1364

Why CheckBox checked not working with Kotlin programmatically?

I think this question may be asked before but this issue happened with me too so , I'm asking here again to see we can get some solution over it.

So basically problem is making Checkbox checked Programmatically not working with Kotlin code . To explain , I'm sharing my code & screenshot of problem.

     //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
        }
      }
   }

Here is xml of entire layout :

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

And here is declarations part in Kotlin:

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

Here is retrieving part:

    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)

And here is output: See last two checkbox , only border is coloured but not selected.

enter image description here

Upvotes: 2

Views: 4398

Answers (2)

Deep Shah
Deep Shah

Reputation: 1364

Okay , I got an answer. Actually there were two issues , which I have found during finding solution :

  1. This issue is not related to Kotlin , this is happening in Java too.
  2. setChecked worked with Android 5.0 but not working with Nougat

Here are few reference which I referred :

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)

And here is a solution which works for me on both android versions:

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

I hope this helps anyone who is looking for similar kind of solution (thx @Nipper)

Upvotes: 4

MobileEvangelist
MobileEvangelist

Reputation: 2628

I don't believe that checkbox check is not supported in kotlin. It's in your case not working properly. You must've done something messy in your code as we're only able to see peace of code not sure what's wrong with your code. Above code is fine otherwise should work, please check the way you've created checkbox.

Also use latest stable release of kotlin always.

Upvotes: 0

Related Questions