在Seekbar上注册LongClick侦听器

时间:2012-05-17 18:51:34

标签: android

在android中,我可以在搜索栏上注册长按一下监听器吗?

我做到了:

mySeekBar.setLongClickable(true);
mySeekBar.setOnLongClickListener(new OnLongClickListener() {
   public boolean onLongClick (View v) {
    Log.d("TEST", "Get a long click event!!!!!!!!!!!!");
 }
});

但我根本没有看到我的调试打印声明。关于如何实现它的任何想法?

谢谢。

3 个答案:

答案 0 :(得分:2)

虽然文档中没有提到,但我已经通过实验确定SeekBars上不支持点击和长按监听器。 ProgressBars支持它们。

挖掘源代码可以了解原因:SeekBar.onTouchEvent()不会调用super.onTouchEvent()。在View.onTouchEvent()中,performClick()performLongClick()被视为适当的。因此,处理SeekBar长按的唯一方法是手动检测它们。

我自己的想法是,为SeekBar设置一个长按处理程序实际上没有意义。如果用户拖动“拇指”的时间超过了长按阈值/延迟,则突然间你有一个长按,可能不是一个。您可以在每次移动拇指时取消和重置延迟,需要在一个位置长按几秒钟。但是完全静止是很少见的;实际上很难握住拇指而不能移动它几秒钟。因此,您可以在拇指位置进行最小的更改,以重置延迟。这就是我必须要做的事情,但我必须说这是一个非常奇怪的用户体验。 Android中有很多地方用户希望长按很重要,但SeekBar不是其中之一。

答案 1 :(得分:1)

AFAICT这不可能与OnLongClickListener有关。文档并没有说它赢了工作,但是我从来没有见过这样的例子(我从来没有让它自己工作)。

可能的解决方法(取决于您希望实现的目标)可能是OnSeekBarChangeListener使用onStartTrackingTouch / onStopTrackingTouch回调来处理长按。

答案 2 :(得分:0)

或者,您可以对SeekBar进行子类化并实现自己的onLongClick侦听器。这不适合胆小的人,但是Terry Long似乎已经以一种圆润的方式完成了它。 (至少我认为他有,我的普通话很生锈。)他列出了四个步骤:

  • 子类SeekBar,重写setOnLongClickListener来杀死它
  • 创建一个在所需的“长按”时间后终止的线程
  • 创建一个在线程终止时被触发的“长按”事件
  • 覆盖SeekBar OnSeekBarChangeListener事件处理程序以处理事件

我没有尝试过他的代码,但基本的想法看起来很合理。我本以为他会试图在AbsSeekBar中做到这一点,以避免重写SeekBar的OnSeekBarChangeListener,但他没有说明为什么他不这样做(再次,AFAICT)。

但是,对我来说听起来有点矫枉过正。 ProgressBar 支持长时间点击;你能以某种方式使用它吗?