通常,检测长按的正确方法是实现
View.OnLongClickListener。这比自己检测更容易,更不容易出错,并且可以确保您的应用程序与系统的其余部分完美匹配。
对于 custom View
,您将添加implements View.OnLongClickListener
到您的类声明中,添加setOnLongClickListener(this);
到构造函数中,然后将onLongClick()
方法添加到您的类中:
public boolean onLongClick (View v) {
// Handle long-click
}
如果您View
不是自定义的,您可以像这样添加侦听器:
theView.setLongClickable(true);
theView.setOnLongClickListener(new View.OnLongClickListener() {
public boolean onLongClick(View v) {
// Handle long-click
}
});
更新:好的,我已经进行了一些挖掘,虽然这对于我曾经使用过的每个视图都是正确的方法,但实际上它不适用于提问者正在使用的 SeekBars。这个事实没有记录在SeekBar
文档中,但实验表明它是正确的,并且深入研究源代码显示了原因:SeekBar.onTouchEvent()
不调用super.onTouchEvent()
. 如果合适的话,它就是View.onTouchEvent()
被调用的。performLongClick()
如果我必须要实现它,我会使用Handler.postDelayed()
. 在 ACTION_DOWN 上,我会发布(例如 3000 毫秒延迟)Runnable
处理长按的 a Handler
,然后我会在 ACTION_UP 上取消它。因此,任何小于延迟的按下都不会最终调用Runnable
,但如果在延迟之后没有发生 ACTION_UP ,那就是。
也就是说,我会提醒你重新考虑这样做。长按 a 是什么意思SeekBar
?如果用户拖动“拇指”的时间超过了延迟时间,那么突然间你就有了一个可能不是本意的长按。您可以在每次移动拇指时取消和重置延迟,需要长按几秒钟才能恰好在一个位置。但是很少有完全静止的;事实上,握住拇指几秒钟不移动它是很困难的。因此,您可以对重置延迟的拇指位置进行最小更改。如果必须,我会这样做,但我必须说这是一种非常奇怪的用户体验。