OnTouch可以工作,但是OnClickListener没有?

我创建了一个小部件/控件,我可以重用我通过扩展RelativeLayout创建的。 然后,在我的一个活动中,我在循环中创建了一堆这些小部件。 但是,当我想让每个小部件响应一次点击时,我遇到了一个问题。

我发现设置OnTouchListener有效:

  this.setOnTouchListener(new OnTouchListener(){ public boolean onTouch(View arg0, MotionEvent arg1) { //Triggers debug message } }); 

但是OnClickListener没有:

  this.setOnClickListener(new View.OnClickListener(){ public void onClick(View v) { //Doesn't trigger debug message } }); 

为什么是这样?

以下是一些要检查以确保您的观看次数可以点击的内容:

 View.setClickable() View.setEnabled() View.setFocusable() View.setFocusableInTouchMode() 

根据您希望获得的确切行为,您需要将其中一个或多个设置为开启。 由于你正在进行onTouch事件,我的猜测是你需要setClickable。 但我必须确保视图创建代码。

您应该确保TouchListener没有“消耗”触摸事件。 如果你从onTouch()方法返回true,Android会认为它被消耗了,而不是传递给其他各种触摸处理程序(我假设它将包含ClickListener)。

你应该做:

 this.setOnTouchListener(new OnTouchListener(){ public boolean onTouch(View arg0, MotionEvent arg1) { //Triggers debug message return false; } }); 

您是否正确返回布尔值onTouch值?

来自文档:

onTouch() – 返回一个布尔值,指示您的侦听器是否使用此事件。 重要的是,此事件可以有多个相互跟随的操作。 因此,如果在收到向下操作事件时返回false,则表示您尚未使用该事件,并且对此事件的后续操作也不感兴趣。 因此,您不会在事件中调用任何其他操作,例如手指手势或最终的上行动作事件。

编辑

在这个问题中find了解决方案并且我自己试了一下。

你需要使用这个return super.onTouchEvent(event); 在你的onTouchEvent代码中。 添加此项后,OnClickListener开始工作。

要执行此操作,请在onTouch()返回false,如下所示:

 this.setOnTouchListener(new OnTouchListener(){ public boolean onTouch(View arg0, MotionEvent arg1) { return false; } }); 

您可以通过onTouchListener实现onClickListener:

 webView.setOnTouchListener(new View.OnTouchListener() { public final static int FINGER_RELEASED = 0; public final static int FINGER_TOUCHED = 1; public final static int FINGER_DRAGGING = 2; public final static int FINGER_UNDEFINED = 3; private int fingerState = FINGER_RELEASED; @Override public boolean onTouch(View view, MotionEvent motionEvent) { switch (motionEvent.getAction()) { case MotionEvent.ACTION_DOWN: if (fingerState == FINGER_RELEASED) fingerState = FINGER_TOUCHED; else fingerState = FINGER_UNDEFINED; break; case MotionEvent.ACTION_UP: if(fingerState != FINGER_DRAGGING) { fingerState = FINGER_RELEASED; // Your onClick codes } else if (fingerState == FINGER_DRAGGING) fingerState = FINGER_RELEASED; else fingerState = FINGER_UNDEFINED; break; case MotionEvent.ACTION_MOVE: if (fingerState == FINGER_TOUCHED || fingerState == FINGER_DRAGGING) fingerState = FINGER_DRAGGING; else fingerState = FINGER_UNDEFINED; break; default: fingerState = FINGER_UNDEFINED; } return false; } }); 

如果由于某种原因覆盖onMotionEvent()方法并且在这种情况下需要返回true / false,则可以在返回true之前通过在重写的onMotionEvent()内调用this.performClick()来手动触发OnClickListener()回调。 /假。

当您在同一视图上同时需要onClick和onTouch事件时,请使用GestureDetector 。