setEnabled() 与 setClickable() 有啥区别?

Posted

技术标签:

【中文标题】setEnabled() 与 setClickable() 有啥区别?【英文标题】:setEnabled() vs setClickable(), what is the difference?setEnabled() 与 setClickable() 有什么区别? 【发布时间】:2013-03-14 23:51:45 【问题描述】:

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

于是我去文档看下面方法的解释:

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

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

【问题讨论】:

我猜 setEnabled (false) 会使 View 不可点击且不可聚焦,这意味着它会被完全锁定。此外, setEnabled(false) 是 Button 的首选方式,因为它使 Button 在视觉上“禁用” 你是什么意思:“..因为它使按钮在视觉上“禁用”?它如何在视觉上改变它?如果我使用自定义选择器会怎样? 不确定自定义选择器,尚未测试。但如果是标准按钮,它会变得半透明,因此您无需手动操作 【参考方案1】:

这是什么意思?

引用the Wikipedia page for "GUI widget":

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

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

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

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

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

使Button 看起来和响应像Button 的原因在于它的背景,即StateListDrawable。有一个特定的图像用于禁用状态。

【讨论】:

@Maver1ck:Button StateListDrawable 肯定有一个禁用状态:github.com/android/platform_frameworks_base/blob/master/core/… Button 类可能应用了其他效果,尽管我不知道有任何效果。 我刚刚做了一个小测试,似乎对于按钮,文本颜色也发生了变化。当我将按钮的启用设置为 false 时,它​​会变灰。 所以基本上如果我使用自定义选择器?如果我想在此特定按钮上使用 setEnable() 方法(并获得有关此更改的反馈),我应该指定某个可绘制对象? @FD_:啊,是的,这是TextView 禁用的行为,Button 继承了它。文本颜色通常是 ColorStateList 对象,它们也可以具有启用和禁用状态。抱歉,我忘记了。 @EmilAdz:如果您更改文本颜色或更改按钮背景,您将希望在ColorStateListStateListDrawable 中有一个适当的条目以用于禁用状态。当调用setEnabled(false) 或在布局中使用android:enabled="false" 时,将使用该条目。【参考方案2】:

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

【讨论】:

【参考方案3】:

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

【讨论】:

【参考方案4】:

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

【讨论】:

【参考方案5】:

视图还可以响应外部键盘、方向键(遥控器/游戏控制器)和辅助设备(switch、screen readers)。

【讨论】:

【参考方案6】:

上面列出了不同之处,但有一个提示。在 setOnClickListener() 之后使用 setClickable()。正因为如此:

public void setOnClickListener(@Nullable OnClickListener l) 
    if (!isClickable()) 
        setClickable(true);
    
    getListenerInfo().mOnClickListener = l;

【讨论】:

【参考方案7】:

setClickable public void setClickable(布尔可点击)

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

设置启用 public void setEnabled(启用布尔值)

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

【讨论】:

以上是关于setEnabled() 与 setClickable() 有啥区别?的主要内容,如果未能解决你的问题,请参考以下文章

button.setEnabled(false) 在 ViewPager 中不起作用

setEnabled() 和 setClickable() 的区别

UITextView setEnabled:导致保留计数增加?

iOS UIButton - UIButton setUserInteractionEnabled 和 setEnabled 之间的区别

UIButton setEnabled 不起作用

iOS UIButton、setEnabled 和 button.hidden 不起作用