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
не назовут.
Вы можете установить
app:checkListener
и использоватьBindingAdapter
:@BindingAdapter("app:checkListener") fun CheckBox.setCheckedChangeListener(listener: CompoundButton.OnCheckedChangeListener) { setOnCheckedChangeListener(listener) }
Или наблюдайте за изменениями в
someState
:viewModel.someState.observe(viewLifecycleOwner) { viewModel.changeCheckBox() // Other actions. }
Есть несколько причин не работать.
В вашем xml вы должны определить проверенный тип в соответствии с вашими требованиями.
android:checked="false"
В java-файле вам необходимо использовать
setOnCheckedChangeListener()
.
Надеюсь, это сработает для всех.