Android如果已经执行了setOnLongClickListener,则不执行setOnTouchListener

Android do not execute setOnTouchListener if setOnLongClickListener has been executed

我有一个应用程序,您可以在其中按下屏幕并执行一个方法,也可以在其中长按并执行另一个方法。问题是,当我长按屏幕时,正常的 onClickListener 也会被执行,这是我不想要的。 它们都是简单的 onClickListeners,正常的是使用 MotionEvent ACTION_UP。有什么办法可以防止这种情况发生吗? 所以我不想在执行 onLongClickListener 时在普通的 onTouchListener 中执行 ACTION_UP。

代码:

layout.setOnTouchListener(new View.OnTouchListener() {
        @Override
        public boolean onTouch(View v, MotionEvent event) {
            if (event.getAction() == MotionEvent.ACTION_UP) {

            }
            return false;
        }
    });
    layout.setOnLongClickListener(new View.OnLongClickListener() {
        @Override
        public boolean onLongClick(View v) {
            return true;
        }
    });

如果 onclick 与您预期的一样,使用 onclick 侦听器而不是 ontouch 这样您就不会在长按时触发 onclick。

如果你还想onTouch

    int flag=0
    layout.setOnTouchListener(new View.OnTouchListener() {
    @Override
    public boolean onTouch(View v, MotionEvent event) {
        if (event.getAction() == MotionEvent.ACTION_UP) {
            if(flag==0){
              //do something 
            }else{
              flag=0;
            }

        }
        return false;
    }
});
layout.setOnLongClickListener(new View.OnLongClickListener() {
    @Override
    public boolean onLongClick(View v) {
        flag=1
        return true;
    }
});

LongClickClick 处于同一级别,而 Touch 不是(实际上 LongClick 和 Click 是从 onTouchEvent 调度的)。

在你的代码中,你总是在 onTouch 方法中 return false,所以你不会消耗事件,它会被传递到下一个级别(LongClick,Click ...),这就是为什么当您长按屏幕时会调用这两个方法。

  • 建议1:

使用 ClickListener 代替 TouchListener

  • 建议2:

使用GestureDetector to handle all events (touch, longclick...). This is an example

  • 建议3:

使用标志来执行所需的事件。

private boolean longClick = false;


layout.setOnTouchListener(new View.OnTouchListener() {
    @Override
    public boolean onTouch(View v, MotionEvent event) {
       if (longClick) {
             longClick = false;
          }
        return false;
    }
});

layout.setOnLongClickListener(new View.OnLongClickListener() {
    @Override
    public boolean onLongClick(View v) {
        longClick = true;
        return false;
    }
});
  • 建议4:

使用可运行的处理程序。 Example1 and Example2