4

我有一个可以动态禁用并绑定到点击侦听器的复选框:

CheckBox chkbox = (CheckBox)findViewById(R.id.chkboxid);

if(condition) {
     chkbox.setEnabled(false);
     chkbox.setOnClickListener(displayPopup);
} else {
     chkbox.setOnClickListener(handleToggle);
}

这样做的目的是,如果该复选框被禁用,我想为单击该复选框的用户提供更多信息,说明为什么该选项被禁用。

从那以后,我意识到禁用的小部件不会向点击侦听器发送点击事件。我已经尝试LinearLayout通过执行以下操作将其设置为可点击:

CheckBox chkbox = (CheckBox)findViewById(R.id.checkboxName);
LinearLayout layout = (LinearLayout)findViewById(R.id.layoutName);
if(condition) {
     chkbox.setEnabled(false);
     layout.setClickable(true);
     layout.setDescendantFocusability(ViewGroup.FOCUS_BLOCK_DESCENDANTS);
     layout.setOnClickListener(displayPopup);
} else {
     chkbox.setOnClickListener(handleToggle);
}

这适用于单击LinearLayout禁用复选框之外的任何位置。它没有遵循FOCUS_BLOCK_DESCENDANTS设置。我也尝试在复选框上放置一个不可见的可点击对象,但在那里也没有成功。有任何想法吗?

编辑:我们现在被困在 API lvl 8 中,否则我会尝试降低复选框的 alpha 而不是禁用它以至少模拟被禁用的外观。

4

2 回答 2

4

Android:禁用复选框不响应点击事件

我认为如果CheckBox禁用或其他类型的小部件,则无法处理任何事件。

但是要做什么简单的把戏。让CheckBox启用,当需要的东西没有填满时,总是将检查状态设置为 false。它看起来像“我不能勾选复选框,有些东西不好”,并通过 Toast 显示一些警告消息。

checkBox.setOnClickListener(new OnClickListener() {
    @Override
    public void onClick(View v) {
        if (somethingIsNotFilledUp) {
            checkBox.setChecked(false);
            Toast.makeText(Main.this, "You didn't fill required fields", Toast.LENGTH_SHORT).show();
        }
        else {
            // do some stuff
        }
    }
});

我希望他们看到不同之处

您可以通过使用自定义复选框的外观来实现它。

于 2013-03-20T22:09:20.383 回答
2

您无法在禁用的复选框上接收事件,但我做了其他技巧来模拟禁用的复选框,您可以在其中接收复选框事件并启用它,例如长按它

模拟禁用复选框接收事件

希望这可以帮助你

于 2016-06-15T10:20:34.140 回答