Тоже долго ломал голову над этой проблемой. Перебрал множество способов, но все они имели проблемы совместимости с версиями платформы. В итоге остановился на обработчике onTouchListener для EditText'а:
editText.setOnTouchListener(onTouchListener);
View.OnTouchListener onTouchListener = new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
editTextPinCode.setFocusable(true);
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
Layout layout = ((EditText) v).getLayout();
float x = event.getX() + editTextPinCode.getScrollX();
int offset = layout.getOffsetForHorizontal(0, x);
if(offset>0)
if(x>layout.getLineMax(0))
editTextPinCode.setSelection(offset);
else
editTextPinCode.setSelection(offset - 1);
break;
}
return true;
}
};