5

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

我已经这样做了:

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

但我根本看不到我的调试打印语句。关于如何实现它的任何想法?

谢谢你。

4

3 回答 3

2

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

挖掘源代码显示了原因:SeekBar.onTouchEvent()不调用super.onTouchEvent(). 它就在View.onTouchEvent()其中,performClick()performLongClick()在适当的时候被调用。因此,处理长按 a 的唯一方法SeekBar是手动检测它们。

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

于 2012-06-14T01:39:47.807 回答
1

AFAICT 这不可能与OnLongClickListener. 文档并没有说它不起作用,但我从未见过任何这样的例子(我自己也从来没有让它起作用)。

一种可能的解决方法(取决于您想要实现的目标)可能是使用OnSeekBarChangeListener处理长点击onStartTrackingTouch/onStopTrackingTouch回调。

于 2012-05-18T08:28:38.580 回答
0

或者,您可以继承 SeekBar 并实现您自己的 onLongClick 侦听器。这不是为胆小的人准备的,但特里·朗似乎是绕道而行。(至少我认为他有,我的普通话很生疏。)他列出了四个步骤:

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

我没有尝试过他的代码,但基本想法看起来很合理。我原以为他会尝试在 AbsSeekBar 中执行此操作以避免覆盖 SeekBar 的 OnSeekBarChangeListener,但他没有说明他为什么不这样做(再次,AFAICT)。

不过,对我来说听起来有点矫枉过正。ProgressBar确实支持长按;你能以某种方式使用它吗?

于 2012-05-18T13:58:22.933 回答