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

问题描述 投票:66回答:7

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

所以我去了文档,看看方法的解释如下:

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

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

android android-button clickable
7个回答
73
投票

这到底是什么意思?

引用the Wikipedia page for "GUI widget"

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

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

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

在Android中,无法点击的窗口小部件不会响应点击事件。禁用的窗口小部件不仅不可单击,而且还可视地指示它已被禁用。

你的意思是:“因为它使得Button在视觉上”禁用“?它是如何在视觉上改变的?

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


4
投票

所以基本上一个启用的false不会响应任何响应和在运行时设置的可点击的错误仍然响应并相信我我只是尝试过它。


1
投票

正如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
投票

视图还可以响应外部键盘,方向键盘(远程/游戏控制器)和辅助设备(switchscreen readers)。


0
投票

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

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

0
投票

setClickable public void setClickable(boolean clickable)

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

setEnabled public void setEnabled(boolean enabled)

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


0
投票

我在其他地方没有看到的一个重大区别是视图重叠。具有clickable = true且enabled = false的视图将不允许您按下其后面的View。但是使用clickable = false的View将允许您按下后面的View。

© www.soinside.com 2019 - 2024. All rights reserved.