87

到目前为止,当我想阻止用户按下按钮时,我会设置button.setClickable(false);并通常将文本更改为某种灰色(让用户知道按钮已禁用)。今天我偶然发现了该setEnabled()物业。

所以我去文档看下面方法的解释:

setEnabled(boolean enabled)
   Set the enabled state of this view.

这甚至意味着什么?启用状态/可点击状态和禁用状态/不可点击状态有什么区别?有人可以解释一下我以前做的事情,使用可点击属性和使用该属性有什么区别setEnabled()吗?什么时候应该用?我搜索了 Stack Overflow,但找不到任何相关内容。

4

7 回答 7

86

这他妈是什么意思?

引用“GUI 小部件”的 Wikipedia 页面

在应用程序的上下文中,可以在给定时间点启用或禁用小部件。启用的小部件具有响应事件的能力,例如击键或鼠标操作。无法响应此类事件的小部件被视为已禁用。禁用的小部件的外观通常与启用的小部件不同;禁用的小部件可能以较浅的颜色绘制,或者可能以某种方式在视觉上被遮挡。示例见右图。

这个概念已经存在了几十年,并且可以在大多数 GUI 框架中找到。

启用状态/可点击状态和禁用状态/不可点击状态有什么区别?

在 Android 中,不可点击的小部件不会响应点击事件。禁用的小部件不仅不可点击,而且还直观地表明它已被禁用。

你是什​​么意思:“..因为它使按钮在视觉上“禁用”?它如何在视觉上改变它?

使Button外观和响应像 a 的Button是它的背景,即 a StateListDrawable。有用于禁用状态的特定图像。

于 2013-03-25T13:46:22.297 回答
7

我在其他地方没有提到的一个很大的区别是重叠的视图。带有 clickable=true 和 enabled=false 的视图将不允许您按其后面的视图。但是带有 clickable=false 的 View 将允许您按下它后面的 View。

于 2019-02-01T03:30:01.970 回答
6

因此,基本上启用的 false 不会响应任何响应,而在运行时设置的可单击的 false 仍然响应,相信我,我刚刚尝试过。

于 2016-08-03T10:29:08.867 回答
2

正如 Dilip 所说,如果在运行时设置 setClickable 则不起作用。这是使它工作的技巧:

ToggleButton toggle = ...
toggle.setOnTouchListener(new ToggleButton.OnTouchListener() {

  @Override
  public boolean onTouch(View v, MotionEvent event) {
     // If true is returned, the event is eated by the TouchListener
     return !v.isClickable();
  }
});
于 2016-08-16T13:27:50.363 回答
1

视图还可以响应外部键盘、方向键(遥控器/游戏控制器)和辅助设备(开关屏幕阅读器)。

于 2016-11-17T17:28:35.723 回答
0

setClickable public void setClickable (boolean clickable)

它启用或禁用特定视图的点击事件。当一个视图可点击时,它会在每次点击时将其状态更改为“按下”。如果视图的这个属性被禁用,那么它不会改变它的状态。

setEnabled public void setEnabled(启用布尔值)

它设置此视图的启用状态。如果特定视图设置为启用,则在参数中传递 true,否则传递 false

于 2018-08-20T11:19:09.633 回答
0

上面列出了差异,但有一个提示。在 setOnClickListener() 之后使用 setClickable()。因为这:

public void setOnClickListener(@Nullable OnClickListener l) {
    if (!isClickable()) {
        setClickable(true);
    }
    getListenerInfo().mOnClickListener = l;
}
于 2018-07-15T06:35:10.410 回答