Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

onTouchEvent is not called when talkback enabled on custom view

I'm implementing custom keyboard (through custom view) for password field and trying add accessibility feature, so when user single press on view it should pronounce selected value.

In my custom keyboard I need coordinates from MotionEvent so view can calculate on what draw (value) it was pressed.

But in this case when Talkback enabled onTouchEvent method is not called. It calls only when user double tap on view. Im trying to add custom OnTouchListener but it does not work. setFocusable=true and setFocusableInTouchMode=true.

like image 329
aim Avatar asked Oct 21 '14 14:10

aim


2 Answers

When TalkBack is enabled a double tap is the equivalent of a single tap. That is, onTouchEvent will only be called when the user double taps a view/widget.

like image 34
Luke Simpson Avatar answered Nov 14 '22 23:11

Luke Simpson


For those that come across this question and looking for a solution; When accessibility (Talkback) is enabled, onTouchEvent method is not called on single tap, it's called on double taps instead.

To catch single taps when accessibility is enabled, and/or override this behaviour, onHoverEvent method of View class should be overriden. By using this method, you can catch single touch down as ACTION_HOVER_ENTER, move as ACTION_HOVER_MOVE and up as ACTION_HOVER_EXIT.

Also you can override this behaviour by modifying the action of caught MotionEvent and sending it to onTouchEvent method as shown below:

@Override
public boolean onHoverEvent(MotionEvent event) {
    if (accessibilityManager.isTouchExplorationEnabled() && event.getPointerCount() == 1) {
        final int action = event.getAction();
        switch (action) {
            case MotionEvent.ACTION_HOVER_ENTER: {
                event.setAction(MotionEvent.ACTION_DOWN);
            } break;
            case MotionEvent.ACTION_HOVER_MOVE: {
                event.setAction(MotionEvent.ACTION_MOVE);
            } break;
            case MotionEvent.ACTION_HOVER_EXIT: {
                event.setAction(MotionEvent.ACTION_UP);
            } break;
        }
        return onTouchEvent(event);
    }
    return true;
}
like image 71
CanC Avatar answered Nov 14 '22 22:11

CanC