jwBurnside
jwBurnside

Reputation: 887

Android set switch status inside onCheckChangedListener

I want toggle a Switch to false if the user toggles it to true.

In order to avoid firing onCheckChanged again, I remove the listener, then add it back after the switch.

mCheckedChangeListener = new CompoundButton.OnCheckedChangeListener() {
    @Override
    public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
        if(isChecked) {
            mMySwitch.setOnCheckedChangeListener(null);
            mMySwitch.setChecked(false);
            mMySwitch.setOnCheckedChangeListener(mCheckedChangeListener);
        } 
};
mMySwitch.setOnCheckedChangeListener(mCheckedChangeListener);

This doesn't work, however, and I'm not sure why. When I toggle to true, it stays on true.

/** Update **/ Apparently I don't have to set the listener null, so here's another that still does not set the switch to false:

mMySwitch.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
    @Override
    public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
        if(isChecked) {
            mMySwitch.setChecked(false);
        }
    }
});
return v;

Upvotes: 1

Views: 342

Answers (1)

jwBurnside
jwBurnside

Reputation: 887

I dug a little more and Looks like this is a known issue: https://code.google.com/p/android/issues/detail?id=57980

This workaround seems to work until someone has a better answer:

mMySwitch.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
    if(isChecked) {
        // Not sure why I need a delay here, but it won't fire otherwise.
        final Handler handler = new Handler();
        handler.postDelayed(new Runnable() {
            @Override
            public void run() {
                mMySwitch.setChecked(false);
            }
        }, 100);

    }

}
});

Upvotes: 2

Related Questions