Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/194.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android:Disabled复选框不响应单击事件_Android - Fatal编程技术网

Android:Disabled复选框不响应单击事件

Android:Disabled复选框不响应单击事件,android,Android,我有一个复选框,可以动态禁用并绑定到单击侦听器: CheckBox chkbox = (CheckBox)findViewById(R.id.chkboxid); if(condition) { chkbox.setEnabled(false); chkbox.setOnClickListener(displayPopup); } else { chkbox.setOnClickListener(handleToggle); } 这样做的目的是,如果该复选框被禁

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

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

if(condition) {
     chkbox.setEnabled(false);
     chkbox.setOnClickListener(displayPopup);
} else {
     chkbox.setOnClickListener(handleToggle);
}
这样做的目的是,如果该复选框被禁用,我想为单击该复选框的用户提供有关为什么禁用该选项的更多信息

我后来意识到,禁用的小部件不会向单击侦听器发送单击事件。此后,我尝试通过执行以下操作将
线性布局设置为可单击:

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);
}
这适用于单击
线性布局
中除禁用复选框外的任何位置。它没有遵循
焦点\块\子体
设置。我也尝试过在复选框上放置一个不可见的可点击对象,但也没有成功。有什么想法吗

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

Android:Disabled复选框不响应单击事件

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

但是我们来做一个简单的小把戏。启用
复选框
,当所需内容未填写时,始终将选中状态设置为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
        }
    }
});
我想让他们看到区别


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

您不能在禁用的复选框上接收事件,但我做了另一个技巧,模拟禁用的复选框,您可以在其中接收复选框事件并启用它,例如长按它


希望这对您有所帮助

我考虑过这一点。问题是,我希望用户能够直观地看到它被启用或禁用,因为条件可能会发生变化,而用户不会主动做任何事情。这听起来可能令人困惑,但根据另一个用户(如管理员)的设置,该条件是真是假,如果管理员用户决定让它可用,我希望他们看到区别。@Megan您可以使用自定义复选框背景实现它,例如:)这是我的团队最终决定的。我将使用一些信息作为参考。我只是做了一件类似的事情,简单地使用深灰色按钮色调和文本颜色作为复选框,并使onClickListener始终执行设置选中(false);它看起来像是被禁用了,虽然有一毫秒它会切换,但随后会再次关闭,您可以进行处理。就我而言,这已经足够好了。你好,本