Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Can't handle both click and touch events simultaneously

I am trying to handle touch events and click events on a button. I do the following:

button.setOnClickListener(clickListener); button.setOnTouchListener(touchListener); 

When any one listener is registered things work fine but when I try to use them both only the touch events are fired. Any workaround? What am I doing wrong?

like image 479
Ragunath Jawahar Avatar asked Mar 01 '11 19:03

Ragunath Jawahar


2 Answers

Its a little tricky.

If you set onTouchListener you need to return true in ACTION_DOWN, to tell the system that I have consumed the event and it won't trickle down to other listeners.

But then OnClickListener won't be fired.

So you might think, I will just do my thing there and return false so I can receive clicks too. If you do so, it will work, but you won't be subscribed to other upcoming touch events (ACTION_MOVE, ACTION_UP) Therefore, the only option is to return true there, but then you won't receive any click events as we said previously.

So you need to perform the click manually in the ACTION_UP with view.performClick()

This will work.

like image 112
urSus Avatar answered Sep 25 '22 04:09

urSus


There is a subtle, yet very important difference between the ClickListener and the TouchListener. The TouchListener is executed before the view can respond to the event. The ClickListener will receive its event only after the view has handled it.

So when you touch your screen, the TouchListener is executed first and when you return true for your event, the ClickListener will never get it. But if you press the trackball of your device, the ClickListener should be fired because the TouchListener will not respond to it.

like image 41
Chris Avatar answered Sep 23 '22 04:09

Chris