我有一个应用程序,你可以在屏幕上按下并执行一个方法,你可以长按,然后执行另一个方法。问题是,当我长按屏幕时,正常的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;
}
});
答案 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)
LongClick
和Click
处于同一级别,而Touch
不是(实际上LongClick和点击是从onTouchEvent调度的)。
在您的代码中,您始终以false
方式返回onTouch
,因此您不会参与此事件并将其传递到下一个级别(LongClick,Click ...)这就是为什么当你长按屏幕时,你有两个方法叫做。
使用ClickListener
代替TouchListener
。
使用GestureDetector处理所有事件(触摸,长按...)。这是example
使用标志执行所需的事件。
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;
}
});
答案 2 :(得分:0)
如果onclick与你想要的一样使用onclicklistener而不是ontouch那么你长按一下就不会触发onclick。