gpt4 book ai didi

android - Android 上的快速点击事件处理

转载 作者:搜寻专家 更新时间:2023-11-01 08:50:26 25 4
gpt4 key购买 nike

如果您快速点击 2 个单独的按钮,甚至是同一个按钮,Android 将处理这两个点击事件。当它可以两次启动服务、显示两次对话框或在彼此之上启动 Activity 等时,这就成为一个问题。

防止双击单个按钮的修复非常简单,答案遍布 StackOverflow。您可以使用 bool 标志简单地检查按钮是否已被单击,并停止处理任何进一步的单击事件。

我的问题是用户可能会快速按下两个(或更多)不同的按钮(或列表项或 ActionBar 项等)。处理“已单击按钮 x -> 更好地禁用按钮 x、y、z”的每个组合将非常乏味且容易出错。

有人对此有好的解决方案吗?

最佳答案

我将使用我的 .02,尽管这可能不是一个不错的解决方案。这很简单,没有考虑到例如启用按钮、调度或任何其他复杂的操作。它可能会删除一些样板,例如禁用按钮,但代价是丑陋的 try-finally 语法:

public final class EventLocker {

private static Object lock;

public static synchronized boolean lock(final Object object) {
if (null == object) { throw new IllegalArgumentException("object must not be null"); }
if (null == lock) {
lock = object;
return true;
}
return false;
}

public static synchronized boolean release(final Object object) {
if (null != lock && lock.equals(object)) {
lock = null;
return true;
}
return false;
}

}

然后,假设您希望在按钮上设置 OnClickListener:

button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
if (EventLocker.lock(view)) {
try {
doSomething();
} finally {
EventLocker.release(view);
}
}
}
});

如果您一直使用锁定-解锁惯用语,则可以保证例如在按钮 A 释放锁定之前,按钮 B 不会执行任何操作。从好的方面来说,如果需要,可以很容易地添加自定义要求。


回答下面第一条评论:

您完全正确 - 在我的回答中没有特别提到这一点,这对我来说有点草率。

例如,每个 onClick() 事件都会发送到主线程队列。有趣的是,它提出了一个我不可避免地试图避免的话题​​;如果按钮点击事件按顺序处理并且不离开主线程,那么例如双击不是异常,而是在短时间内一个接一个地处理两个有效 Action 。

这确实没有错 - 150 毫秒的短时间可能没有意义,但 10 秒可能是一个完全可行的选择。在这种情况下,我认为最好确保 onClick 实现足够聪明,可以重用、重建或以任何其他方式处理手头的资源。

关于android - Android 上的快速点击事件处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23928958/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com