【问题标题】:CheckBox OnClick Toggled Before OnClick Handler?CheckBox OnClick 在 OnClick 处理程序之前切换?
【发布时间】:2016-03-11 11:14:25
【问题描述】:

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

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

它总是会点击这个 if 语句并立即将复选框设置为未选中,因为它在到达 OnClickListener 之前将其设置为 ischecked true。我发现的最简单的解决方法是:

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

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

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

【问题讨论】:

    标签: android checkbox


    【解决方案1】:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-09-11
      • 2011-05-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多