OnClickListener在Android中被调用两次
我有以下用例:当点击一个OnClickListener在Android中被调用两次,android,onclicklistener,onlongclicklistener,Android,Onclicklistener,Onlongclicklistener,我有以下用例:当点击一个视图时,它应该打开一个活动,当长时间点击时,它应该在至少300毫秒或用户的动作事件后打开另一个活动。 我为此编写了以下代码: holder.fiveAction.setOnLongClickListener(new View.OnLongClickListener() { @Override public boolean onLongClick(View v) { //open activit
视图时,它应该打开一个活动
,当长时间点击时,它应该在至少300毫秒或用户的动作
事件后打开另一个活动
。
我为此编写了以下代码:
holder.fiveAction.setOnLongClickListener(new View.OnLongClickListener() {
@Override
public boolean onLongClick(View v) {
//open activity A after launching an animation of 300ms
isLongPressed = true;
return true;
}
});
holder.fiveAction.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
v.onTouchEvent(event);
// We're only interested in when the button is released.
if (event.getAction() == MotionEvent.ACTION_UP) {
// We're only interested in anything if our speak button is currently pressed.
if (isLongPressed) {
//open activity A even if animation hasn't ended
// Do something when the button is released.
isLongPressed = false;
}
}
return false;
}
});
holder.fiveAction.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
LogUtil.i(TAG, "hi five onClickListener called");
//open some activity B or do some work
});
这个设置的问题是,OnClickListener
被调用了两次,这是我不想看到的。我想知道为什么会发生这种情况,以及如何在不影响我的用例的情况下修复这种情况。您使用三个侦听器1。OnLongClickListener
2。OnTouchListener
3。OnClickListener
当您首先单击视图时,它将调用OnTouchListener,然后调用OnClickListener
这就是为什么你的活动会引发两次
使用这个技巧我相信你的问题会解决。。。。。。我自己测试
您需要声明holder.fiveAction
为final
我遇到这个问题是因为有缺陷的Android调试器,当正常运行时,函数被调用一次,而调试器连接时,它被调用两次。为什么不使用setOnLongClickListener()?默认的onLongClickListener是否足以满足您的用例?没有理由在这里引入onTouchListener。@FarshidABZ如果我只进行长时间单击,那么活动只有在动画完成后才会打开。我的用例是,如果长按已注册,即使动画正在运行且尚未完成,如果用户释放touch,它应该打开“活动”。@e或默认的长单击侦听器将无法满足要求,因为我还需要检测ACTION\u UP
。每当触发onTouchListener
时,onClickListener
是否总是被触发?可以单击任何东西而不触碰它吗?您可以使用“MotionEvent.ACTION\u UP”。这是同样的事情,如果你触摸任何东西,你必须提高你的触摸。所以在这种情况下,必须始终触发两个事件。有解决方法吗?我希望单击和长按都能正常工作。您希望,当您单击它时打开ActivityB,当长按它时打开ActivityA 300毫秒后,并显示一些动画,但如果您释放click或KeyUp,则它不会等待并打开ActivityA。里特?
holder.fiveAction.setOnLongClickListener(new View.OnLongClickListener() {
@Override
public boolean onLongClick(View v) {
//open activity A after launching an animation of 300ms
holder.fiveAction.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
v.onTouchEvent(event);
// We're only interested in when the button is released.
if (event.getAction() == MotionEvent.ACTION_UP) {
// We're only interested in anything if our speak button is currently pressed.
//open activity A even if animation hasn't ended
// Do something when the button is released.
}
return false;
}
});
return true;
}
});
holder.fiveAction.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
LogUtil.i(TAG, "hi five onClickListener called");
//open some activity B or do some work
});