Android Checkbox setOnCheckedChangeListener не работает

Предполагается, что это что-то довольно простое, но по какой-то причине слушатель Checkbox не работает.

Вот мой макет:

                <RelativeLayout
                android:layout_width="match_parent"
                android:layout_marginRight="16dp"
                android:layout_marginLeft="16dp"
                android:layout_height="wrap_content">
                <TextView
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:textSize="12sp"
                    android:layout_marginLeft="@dimen/dimen_5"
                    android:layout_alignParentLeft="true"
                    android:layout_alignParentStart="true"
                    android:layout_centerVertical="true"
                    android:textStyle="bold"
                    android:text="@string/my_text"
                    />

                <CheckBox
                    android:id="@+id/check_status"
                    android:layout_width="wrap_content"
                    android:layout_alignParentRight="true"
                    android:layout_alignParentEnd="true"
                    android:layout_height="wrap_content" />
            </RelativeLayout>

И вот реализация в моем фрагменте:

CheckBox checkBox = mView.findViewById(R.id.check_status);
            checkBox.setOnCheckedChangeListener(new 
CompoundButton.OnCheckedChangeListener() {
                @Override
                public void onCheckedChanged(CompoundButton buttonView, boolean 
isChecked) {
                    LOGD(TAG, "IsButton checked ? "+ isChecked);
                    Toast.makeText(getActivity(), "Check", 
Toast.LENGTH_SHORT).show();
                }
            });

Как я уже сказал, это должно быть довольно просто, но слушатель… ну, он ничего не слушает. Я тестирую на Nexus 5x Oreo и небольшом Motorola Marshmallow.

В какой-то момент я даже попробовал метод setOnClickListener():

checkBox.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    LOGD(TAG, "IsButton checked ? "+ ((CheckBox) 
v).isChecked());
                }
            });

Результат тот же, я ничего не вижу в logcat

Кто-нибудь знает, почему слушатель Checkbox не работает должным образом?

3 ответа

Решение

Более вероятный, setOnCheckedChangeListener() не вызывается:)

Если вы используете DataBinding, установите атрибут android:checked="@={viewModel.someState}" а позже вызовите этого слушателя через ViewBinding нравиться

      binding.checkBox.setOnCheckedChangeListener { _, _ ->
    //
}

setOnCheckedChangeListener не назовут.

  1. Вы можете установить app:checkListener и использовать BindingAdapter:

            @BindingAdapter("app:checkListener")
    fun CheckBox.setCheckedChangeListener(listener: CompoundButton.OnCheckedChangeListener) {
        setOnCheckedChangeListener(listener)
    }
    
  2. Или наблюдайте за изменениями в someState:

            viewModel.someState.observe(viewLifecycleOwner) {
        viewModel.changeCheckBox()
        // Other actions.
    }
    

Есть несколько причин не работать.

  1. В вашем xml вы должны определить проверенный тип в соответствии с вашими требованиями.

    android:checked="false"

  2. В java-файле вам необходимо использовать setOnCheckedChangeListener().

Надеюсь, это сработает для всех.

Другие вопросы по тегам