setEnabled()vs setClickable()有什么区别?

直到现在,当我想停止用户按下button,我会设置button.setClickable(false); 并通常将文本更改为某种灰色(让用户知道该button被禁用)。 今天我偶然发现了setEnabled()属性。

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

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

这甚至意味着什么? 启用状态/可点击状态与禁用状态/不可点击状态之间有什么区别? 有人可以解释之间做什么之间的区别,使用clickable属性和使用setEnabled()属性? 什么时候应该使用? 我search了StackOverflow,但找不到任何相关的东西。 提前致谢。

这到底是什么意思?

引用“GUI小部件”的维基百科页面 :

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

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

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

在Android中,不可点击的小部件将不会响应点击事件。 禁用的小部件不仅不可点击,而且还可视化地指示它被禁用。

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

是什么让一个Button看起来像一个Button是它的背景,这是一个StateListDrawable 。 有一个特定的图像用于禁用状态。

所以基本上一个启用的假不响应任何响应,并在运行时设置一个可点击的虚假仍然响应,相信我,我只是试了一下。

正如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(); } }); 

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