Почему CheckBox проверил, что Kotlin не работает программно? - PullRequest
2 голосов
/ 04 апреля 2019

Я думаю, что этот вопрос можно было задавать раньше, но эта проблема произошла и со мной, поэтому я прошу здесь снова, чтобы мы могли найти какое-то решение по этому вопросу.

Таким образом, в основном проблема заключается в том, чтобы флажок был установлен программно и не работает с кодом 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>

А вот часть объявления в Котлине:

    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

Ответы [ 2 ]

0 голосов
/ 05 апреля 2019

Хорошо, я получил ответ. На самом деле было две проблемы, которые я нашел при поиске решения:

  1. Эта проблема не связана с Kotlin, это также происходит в Java.
  2. setChecked работал с Android 5.0, но не работает с Nougat

Вот несколько ссылок, на которые я ссылался:

A) Радиокнопка отмечена только частично

B) Android Nougat: почему флажки на фрагменте имеют неполное состояние при программном выборе (но на Lollipop выглядят хорошо)

И вот решение, которое работает для меня на обеих версиях Android:

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

Надеюсь, это поможет любому, кто ищет подобное решение (thx @Nipper)

0 голосов
/ 04 апреля 2019

Я не верю, что проверка флажка не поддерживается в kotlin.Это в вашем случае не работает должным образом.Вы, должно быть, сделали что-то нехорошее в своем коде, поскольку мы можем видеть только спокойствие кода, не зная, что не так с вашим кодом.Над кодом все в порядке, в противном случае он должен работать, пожалуйста, проверьте, как вы создали флажок.

Также всегда используйте последнюю стабильную версию kotlin.

...