6

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.

aim
  • 1,461
  • 1
  • 13
  • 26

2 Answers2

10

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;
}
CanC
  • 3,295
  • 1
  • 14
  • 15
1

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.

Luke Simpson
  • 116
  • 4