所以我正在处理一个复选框列表。我使用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;
}
但这似乎比完成这项任务所需的工作要多得多。
所以,基本上我的问题是:是否有一种方法可以在实际更改之前覆盖并拦截复选框的设置?
答案 0 :(得分:2)
CheckBox的OnClickListener
总是在更改其检查状态后被调用(正如您在复制的performClick()
方法中看到的那样,toggle()
方法更改了检查状态,之后调用超级performClick()
,它将调用OnClickListener
)。
如果您不想总是更改CheckBox的已检查状态,则可以覆盖performClick()
并省略toggle()
方法(或仅在某些条件为真时调用它)。
但是如果你想在每次点击发生时改变状态,那么最简单的方法是使用OnClickListener
,并且只是否定你的条件(例如,如果你想在复选框为空时做某事,然后你检查复选框的新状态是否为空。)