Android在onCheckChangedListener中设置开关状态

时间:2016-06-27 15:43:35

标签: android android-switch

如果用户将其切换为true,我想将Switch切换为false。

为了避免再次触发onCheckChanged,我删除了侦听器,然后在切换后将其添加回来。

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

然而,这并不起作用,我不知道为什么。当我切换到true时,它会保持为真。

/ **更新** / 显然我不必将侦听器设置为null,所以这里的另一个仍然没有将开关设置为false:

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

1 个答案:

答案 0 :(得分:2)

我挖了一点,看起来这是一个众所周知的问题:https://code.google.com/p/android/issues/detail?id=57980

这种解决方法似乎有效,直到有人得到更好的答案:

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

    }

}
});