2015-03-13 63 views
0

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

代码:

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; 
     } 
    }); 
+0

如果您发布一些代码(您的听众),它会更容易帮助您。 – Rami 2015-03-13 17:30:30

+0

更新了tom的问题包括代码 – Broadwell 2015-03-13 17:41:21

回答

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; 
    } 
}); 
+0

谢谢,这个作品完好:) – Broadwell 2015-03-13 19:34:17

0

如果做的onclick一样,你用途的onclick听者,而不是ontouch当你longclick这样你不会触发的onclick。

1

LongClickClick处于同一水平,而Touch不是(实际上LongClick的点击是由派遣的onTouchEvent)。

在代码中,你总是在onTouch方法返回false,这样你就不会comsume的事件,它会被传递到下一个级别(LongClick,点击......),这就是为什么当你长按你有两种方法调用屏幕。

  • Suggestion1:

使用ClickListener,而不是TouchListener

  • Suggestion2:

使用GestureDetector处理所有事件(触摸,longclick ...)。这是一个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:

使用带有可运行的处理程序。 Example1Example2