Change Checkbox value without triggering onCheckChanged
No, you can't do it. The onCheckedChanged
method is called directly from setChecked
. What you can do is the following:
mCheck.setOnCheckedChangeListener (null);mCheck.setChecked (false);mCheck.setOnCheckedChangeListener (mListener);
See the source of CheckBox, and the implementation of setChecked
:
public void setChecked(boolean checked) { if (mChecked != checked) { mChecked = checked; refreshDrawableState(); // Avoid infinite recursions if setChecked() is called from a listener if (mBroadcasting) { return; } mBroadcasting = true; if (mOnCheckedChangeListener != null) { mOnCheckedChangeListener.onCheckedChanged(this, mChecked); } if (mOnCheckedChangeWidgetListener != null) { mOnCheckedChangeWidgetListener.onCheckedChanged(this, mChecked); } mBroadcasting = false; }}
Another possible way to achieve this is by using a custom CheckBox , which will let you choose if you want the listener to be called or not :
public class CheckBox extends AppCompatCheckBox { private OnCheckedChangeListener mListener; public CheckBox(final Context context) { super(context); } public CheckBox(final Context context, final AttributeSet attrs) { super(context, attrs); } public CheckBox(final Context context, final AttributeSet attrs, final int defStyleAttr) { super(context, attrs, defStyleAttr); } @Override public void setOnCheckedChangeListener(final OnCheckedChangeListener listener) { mListener = listener; super.setOnCheckedChangeListener(listener); } public void setChecked(final boolean checked, final boolean alsoNotify) { if (!alsoNotify) { super.setOnCheckedChangeListener(null); super.setChecked(checked); super.setOnCheckedChangeListener(mListener); return; } super.setChecked(checked); } public void toggle(boolean alsoNotify) { if (!alsoNotify) { super.setOnCheckedChangeListener(null); super.toggle(); super.setOnCheckedChangeListener(mListener); return; } super.toggle(); }}
Kotlin version, if you prefer:
class CheckBox @JvmOverloads constructor(context: Context, attrs: AttributeSet? = null, defStyleAttr: Int = 0) : AppCompatCheckBox(context, attrs, defStyleAttr) { private var listener: CompoundButton.OnCheckedChangeListener? = null override fun setOnCheckedChangeListener(listener: CompoundButton.OnCheckedChangeListener?) { this.listener = listener super.setOnCheckedChangeListener(listener) } fun setChecked(checked: Boolean, alsoNotify: Boolean) { if (!alsoNotify) { super.setOnCheckedChangeListener(null) super.setChecked(checked) super.setOnCheckedChangeListener(listener) return } super.setChecked(checked) } fun toggle(alsoNotify: Boolean) { if (!alsoNotify) { super.setOnCheckedChangeListener(null) super.toggle() super.setOnCheckedChangeListener(listener) return } super.toggle() }}
sample usage:
checkBox.setChecked(true,false);