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:如果您更改文本颜色或更改按钮背景,您将希望在ColorStateList
或StateListDrawable
中有一个适当的条目以用于禁用状态。当调用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 之间的区别