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