如果已执行setOnLongClickListener,则Android不会执行setOnTouchListener

时间:2015-03-13 17:14:14

标签: java android methods onclick onclicklistener

我有一个应用程序,你可以在屏幕上按下并执行一个方法,你可以长按,然后执行另一个方法。问题是,当我长按屏幕时,正常的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;
        }
    });

3 个答案:

答案 0 :(得分:1)

如果你还想要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;
    }
});

答案 1 :(得分:1)

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

在您的代码中,您始终以false方式返回onTouch,因此您不会参与此事件并将其传递到下一个级别(LongClick,Click ...)这就是为什么当你长按屏幕时,你有两个方法叫做。

  • Suggestion1:

使用ClickListener代替TouchListener

  • Suggestion2:

使用GestureDetector处理所有事件(触摸,长按...)。这是example

  • Suggestion3:

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

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;
    }
});
  • Suggestion4:

使用runnable处理程序。 Example1Example2

答案 2 :(得分:0)

如果onclick与你想要的一样使用onclicklistener而不是ontouch那么你长按一下就不会触发onclick。