Reputation: 887
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
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