我有一个可以动态禁用并绑定到点击侦听器的复选框:
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值,而不是禁用它以至少模拟被禁用的外观。
答案 0 :(得分:4)
Android:已禁用复选框,不响应点击事件
我认为如果禁用CheckBox
或其他类型的窗口小部件,则无法处理任何事件。
但是要做出简单的伎俩。允许CheckBox
启用,当未填写所需内容时,始终将checked状态设置为false。它看起来像“我无法勾选CheckBox,有些东西不好”并通过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
}
}
});
我希望他们看到差异
您可以使用自定义复选框的外观来实现它。
答案 1 :(得分:1)
您无法在已禁用的复选框上接收活动,但我制作了其他技巧模拟已禁用的复选框,您可以在其中接收复选框事件并按下该按钮以启用它,例如
Simulating disabled checkbox receiving events
希望这有助于你