CheckBox OnClick在OnClick Handler之前切换?

时间:2015-12-06 22:27:54

标签: android checkbox

所以我正在处理一个复选框列表。我使用OnClickListener来捕获触摸事件。我还尝试过OnTouch监听器和OnCheckChanged监听器。我遇到的问题是,在到达任何这些事件侦听器之前,复选框IsChecked值设置为true。所以,如果我做这样的事情:

        checkBox.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if (checkBox.isChecked()) 
                    checkBox.setChecked(false);
            }
        });

它将始终点击此if语句并立即将复选框设置为取消选中,因为它在到达OnClickListener之前将其设置为缺失为真。我找到的最简单方法是:

        checkBox.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                checkBox.setChecked(!checkBox.isChecked());
                if (checkBox.isChecked()) {
                    checkBox.setChecked(false);
                }
            }
        });

但这就是我所谓的hackish。我看到的另一个选项是创建一个新的复选框类并覆盖preformClick方法。

@Override
public boolean performClick() {
    toggle();

    final boolean handled = super.performClick();
    if (!handled) {
        // View only makes a sound effect if the onClickListener was
        // called, so we'll need to make one here instead.
        playSoundEffect(SoundEffectConstants.CLICK);
    }

    return handled;
}

但这似乎比完成这项任务所需的工作要多得多。

所以,基本上我的问题是:是否有一种方法可以在实际更改之前覆盖并拦截复选框的设置?

1 个答案:

答案 0 :(得分:2)

CheckBox的OnClickListener总是在更改其检查状态后被调用(正如您在复制的performClick()方法中看到的那样,toggle()方法更改了检查状态,之后调用超级performClick(),它将调用OnClickListener)。

如果您不想总是更改CheckBox的已检查状态,则可以覆盖performClick()并省略toggle()方法(或仅在某些条件为真时调用它)。

但是如果你想在每次点击发生时改变状态,那么最简单的方法是使用OnClickListener,并且只是否定你的条件(例如,如果你想在复选框为空时做某事,然后你检查复选框的新状态是否为空。)