setEnabled()与setClickable()的区别是什么?


78

到现在为止,当我要阻止用户按下按钮时,我将设置button.setClickable(false);,通常将文本更改为某种灰色(以使用户知道该按钮已禁用)。今天,我偶然发现了这处setEnabled()房产。

因此,我去了文档以查看下面方法的解释:

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

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


5
我猜想setEnabled(false)使View不可点击且不可聚焦,这意味着它已完全锁定。同样,对于Button而言,setEnabled(false)是一种首选方式,因为它使Button在视觉上被“禁用”
Droidman

您是什么意思:“ ..因为它使按钮在视觉上处于“禁用”状态?它如何在视觉上进行更改?如果我使用自定义选择器该怎么办?
Emil Adz 2013年

不确定自定义选择器,尚未对其进行测试。但是如果是标准Button,它会变成半透明的,因此您无需手动进行操作
Droidman

Answers:


79

这到底是什么意思?

在Wikipedia页面上引用“ GUI小部件”

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

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

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

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

您是什么意思:“ ..因为它使Button在视觉上处于“禁用”状态?它如何在视觉上对其进行更改?

是什么让一个Button外观和响应就像Button是它的背景,这是一个StateListDrawable。有一个特定的图像用于禁用状态。


@ Maver1ck:Button StateListDrawable绝对处于禁用状态:github.com/android/platform_frameworks_base/blob/master/core / ...Button尽管我不知道有什么作用,但该类可能还会应用其他效果。
CommonsWare 2013年

我只是做了一个小测试,看来对于Buttons,文本颜色也已更改。当我将按钮的启用设置为false时,它将变为灰色。
FD_

所以基本上,如果我使用自定义选择器?如果要在此特定按钮上使用setEnable()方法(并获得有关此更改的反馈),我应该指定一个特定的drawable?
埃米尔·阿德兹

@FD_:啊,是的,这是被TextView禁用的行为,是Button继承的。文本颜色通常是ColorStateList对象,也可以具有启用状态与禁用状态。抱歉,我忘了。
CommonsWare 2013年

2
@EmilAdz:如果您更改文本颜色或更改按钮背景,则将需要在ColorStateListStateListDrawable处于禁用状态的适当条目。该条目将在setEnabled(false)调用时使用,或android:enabled="false"在布局中使用。
CommonsWare 2013年


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


1

我在其他地方看不到的最大区别是视图重叠。具有clickable = true和enabled = false的视图将不允许您在其后按一个视图。但是带有clickable = false的视图将允许您在其后按一个视图。


0

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

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

0

setClickable public void setClickable(布尔型clickable)

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

setEnabled public void setEnabled(启用布尔值)

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.