安卓:为什么长按也会触发普通点击?

134

我有一个ListView,它有长按和普通点击的监听器。

为什么当我长按列表项时,普通点击事件也会被调用?

我需要为不同的点击事件设置两个不同的函数。

4个回答

305

来自事件监听器:

onLongClick() - 这将返回一个布尔值,以指示您是否消耗了事件,且不应进一步处理它。也就是说,如果您已经处理了该事件并且希望在这里停止,请返回true;如果您没有处理它和/或该事件应继续传递到任何其他单击监听器,请返回false。

您从onLongClick()返回true,但仍然收到普通的单击事件吗?

编辑添加: 对于ListView,您可能正在使用OnItemLongClickListener。那里的onItemLongClick()使用类似的布尔返回值来指示是否消耗了事件。


1
为了设置 myListView.setOnItemLongClickListener(this); 选项,您需要覆盖函数 public boolean onItemLongClick(...)。在这里,您只需要 return true,表示长按已激活并将取消常规单击的触发器。如果返回 false,则还会触发常规单击。 - Brandon
另一种情况是什么呢?当我需要区分长按和普通点击以根据此采取行动时。 - Muhammed Refaat
@erichamion,我尝试了您提供的解决方案,但没有成功。如果您有任何见解或想法,请在此处提供:https://dev59.com/Qqfja4cB1Zd3GeqPwXkZ。 - AJW

60
重新用更简单的语言表述答案:
给定:
@Override
public boolean onLongClick(View view) {

    return true; // or false
}
  • return true 表示事件已被消耗,处理完成。不会有其他的点击事件被通知。
  • return false 表示事件未被消耗,任何其他的点击事件将继续接收通知。

如果你在 onLongClick 之后不想触发 onClick,那么你应该在 onLongClick 事件中返回 true


2
如果我们将值设为true,那么它只会处理长按事件;如果我们将其设为false,则单击和长按事件会同时发生。 - Pir Fahim Shah

20

请确保覆盖OnClickListener来编写您的onClick方法。同时,确保覆盖OnLongClickListener来编写您的onLongClick方法。并且请确保您的onLongClick方法返回true,因为这会消耗onClick事件。


我在我的onLongClick方法中添加了true,但之后我的onClick方法仍然无法触发。我希望能得到任何关于如何解决这个问题的想法或建议,链接在这里:https://dev59.com/Qqfja4cB1Zd3GeqPwXkZ - AJW

0
您可以通过创建new View.OnClickListener()new View.OnLongClickListener()的实例来实现setOnLongClickListener。如果您创建了长按并实现了普通的OnclickListener,您将获得单击激活该方法的错误。 您应该使用new View.OnLongClickListener()仅捕获长按事件。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接