OnTouch的作品,但OnClickListener不?

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

我发现设置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。 但我必须看到视图创build代码是肯定的。

你应该确保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这个问题的解决scheme,只是自己试了一下。

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

要执行这个返回false在你的onTouch()是这样的:

 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事件时,请使用手势检测器 。