安卓:如何增加安卓列表项的长按时间?

4

我有一个自定义的列表视图,其中项目是水平滚动的。我想要对listview项进行单点触控和长按5秒钟。如何做到这一点?如何将listview项的长按时间间隔增加到5秒钟。

4个回答

2

这个功能更准确地复制了onLongPress,因为它在执行之前不等待用户松开手指。它是专门为ViewPager编写的,但应该可以应用类似的逻辑。

// long press duration in milliseconds
public static final int LONG_PRESS_DURATION = 2000;

private boolean mIsTouching = false;

@Override
public boolean onTouchEvent(MotionEvent event) {

    if (event.getAction() == event.ACTION_DOWN) {
        mIsTouching = true;
    } else if (event.getAction() == event.ACTION_UP) {
        mIsTouching = false;
    }

    return super.onTouchEvent(event);
}

@Override
public void onLongPress(MotionEvent event) {

    // subtracts the system set timeout since that time has already occured at this point
    int duration = LONG_PRESS_DURATION - getLongPressTimeout();

    Handler handler = new Handler();
    handler.postDelayed(new Runnable() {
        @Override
        public void run() {
            if (mIsTouching) {
                do something...
            }
        }
    }, duration > 0 ? duration : 0);
}

“onLongPress(MotionEvent)”方法在哪里?我在ViewPager中找不到它。你是指View.OnLongClickListener中的“onLongClick(View view)”吗? - Tim Kist
谢谢。对我有用,尽管我不得不从你的解决方案中删除getLongPressTimeout()。 - TomV
可以通过在 onTouchEvent/ACTION_DOWN 中启动 postDelayed 更简单地完成此操作。在那里,不需要减去 getLongPressTimeout。不需要 onLongPress - ToolmakerSteve

2
这是我的实现:(您不需要释放来触发操作)
Handler longTouchHandler= new Handler();
static final int longduration=10000;//10000ms press duration
@Override
public boolean onTouchEvent(MotionEvent event) {
    if (event.getAction() == event.ACTION_DOWN) {
        longTouchHandler.postDelayed(new Runnable() {
            @Override
            public void run() {
                Log.w("Longpress","longpressed");
            }
        }, longduration);
        return true;
    }
    else if (event.getAction() == event.ACTION_UP) {
        longTouchHandler.removeCallbacksAndMessages(null);
        Log.w("Longpress","cancelled");
    }

    return super.onTouchEvent(event);
}

1
你可以使用 setOnItemLongClickListener,然后你可以设置视图的触摸事件为 OnTouchListener,你可以记录 ACTION_DOWNACTION_UP 的时间,这样你就可以计算出 ACTION_DOWNACTION_UP 之间是否超过了5秒。

2
在我看来,这将是一个不自然的用例,因为我们通常会等待弹出窗口或任何更改才释放手指,用户通常不会数“1.2.3.4.5”然后释放。 - Enzokie
澄清Enzokie的评论:如果您等待ACTION_UP来计算时间,用户就无法知道他们是否已经长按足够长的时间。相反,如果手指仍在触摸屏幕,则应在ACTION_DOWN之后延迟触发操作。请参见Denver的答案。 - ToolmakerSteve

1
你无法更改延迟时间,它已经在安卓框架中被硬编码了。我几天前也遇到了同样的问题。
你可以手动使用setOnTouchListener来解决这个问题。
例如:
private long then;
private int longClickDur= 5000; //5 seconds


//you can use any view you want
ImageView imageView = (ImageView) findViewById(R.id.longclick_view);
imageView.setOnTouchListener(new OnTouchListener() {
      @Override
      public boolean onTouch(View v, MotionEvent event) {
        if (event.getAction() == MotionEvent.ACTION_DOWN) {
          then = (long) System.currentTimeMillis();
        } else if (event.getAction() == MotionEvent.ACTION_UP) {
          if ((System.currentTimeMillis() - then) > longClickDuration) {
            /* Long click behaviour will go here*/
            Toast.makeText(context, "yay, long click", Toast.LENGTH.SHORT);
            return false;
          } else {
            /* LONG CLICK FAILED*/
            Toast.makeText(context, "TRY AGAIN", Toast.LENGTH.SHORT);
            return false;
          }
        }
        return true;
      }
    });

我做了同样的事情,但在那种情况下,列表视图的水平滚动没有发生... - Manish Kumar
这个问题与Enzokie在juemuren的回答中提到的问题相同:它没有给用户任何反馈,告诉他们何时长按触摸足够长。请参考Denver的回答以获得更好的解决方案。 - ToolmakerSteve
这是长按,而不是长按键 - tosh17

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