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;
}
});
LongClick
和 Click
处于同一级别,而 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
我有一个应用程序,您可以在其中按下屏幕并执行一个方法,也可以在其中长按并执行另一个方法。问题是,当我长按屏幕时,正常的 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;
}
});
LongClick
和 Click
处于同一级别,而 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