Comportamiento extraño de ClickableSpan: se llama a onClick () al hacer clic en el espacio vacío

Tengo un TextView con ClickableSpan porque tanto layout_height como layout_width son wrap_content.

Cuando el texto en TextView no es demasiado largo, funciona bien. Cuando el texto es lo suficientemente largo para que tome 2 líneas, también funciona bien pero tiene un comportamiento extraño.

Es entonces cuando hice clic en el espacio vacío de la segunda línea (no se completa con el texto pero forma parte de TextView ), se llama a la retrollamada ClickableSpan onClick() .

No espero esto ya que hice clic solo en el espacio vacío, pero no en el texto distribuido. Aunque no afecta demasiado, quiero saber qué hay detrás.

Configuro ClickableSpan con el siguiente código:

 TextView tv = (TextView) findViewById(R.id.text); tv.setText("TEXT TEXT TEXT TEXT"); SpannableStringBuilder ssb = new SpannableStringBuilder(); ssb.append(tv.getText()); ssb.setSpan(new TestClickableSpan(), ssb.length()-5, ssb.length(), 0); tv.setText(ssb); tv.setMovementMethod(LinkMovementMethod.getInstance()); tv.setOnTouchListener(new TextViewOnTouchListener()); 

El TextViewOnTouchListener:

 class TextViewOnTouchListener implements OnTouchListener{ @Override public boolean onTouch(View v, MotionEvent event) { Log.d("TextView", "onTouch"); return false; } } 

El TestClickableSpan:

 class TestClickableSpan extends ClickableSpan{ @Override public void onClick(View arg0) { Log.d("ClickableSpan", "Confirm OnClick: "+arg0.toString()); } } 

Logré resolverlo extendiendo LinkMovementMethod y verificando si el desplazamiento del evento táctil es igual o mayor que el texto:

 public class MovementMethod extends LinkMovementMethod { @Override public boolean onTouchEvent(TextView widget, Spannable buffer, MotionEvent event) { int action = event.getAction(); if (action == MotionEvent.ACTION_UP || action == MotionEvent.ACTION_DOWN) { int x = (int) event.getX(); int y = (int) event.getY(); x -= widget.getTotalPaddingLeft(); y -= widget.getTotalPaddingTop(); x += widget.getScrollX(); y += widget.getScrollY(); Layout layout = widget.getLayout(); int line = layout.getLineForVertical(y); int off = layout.getOffsetForHorizontal(line, x); if (off >= widget.getText().length()) { // Return true so click won't be triggered in the leftover empty space return true; } } return super.onTouchEvent(widget, buffer, event); } }