Change Checkbox value without triggering onCheckChanged Change Checkbox value without triggering onCheckChanged android android

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


Add this code inside OnCheckedChangeListener:

if(!compoundButton.isPressed()) {            return;}

This will help us to figure out weather checkBox state was changed programmatically or by user action.


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);