Cambiar el color de fondo de un TextView cuando se hace clic

En algunas aplicaciones, como Plaid o incluso en el Navegador de Chrome, algunas partes del texto están subrayadas para transmitir el hecho de que son un enlace que se puede hacer clic y que abrirá una ventana del navegador o una nueva pestaña. Cuando se hace clic en estos vínculos, el color de fondo del texto completo cambia al del color de subrayado. He intentado mirar la fuente de Plaid para replicar este efecto, sin éxito. Lo que estoy tratando de lograr es este efecto:

Introduzca aquí la descripción de la imagen

Creo que esta parte del código crea este efecto:

https://github.com/nickbutcher/plaid/blob/61d59644d5ae9e373f93cef10e0438c50e2eea6d/app/src/main/java/io/plaidapp/util/LinkTouchMovementMethod.java

En realidad, se basa en esta pregunta:

Cambiar el color de texto de un solo ClickableSpan cuando se presiona sin afectar a otros ClickableSpans en el mismo TextView

public class LinkTouchMovementMethod extends LinkMovementMethod { private static LinkTouchMovementMethod instance; private TouchableUrlSpan pressedSpan; public static MovementMethod getInstance() { if (instance == null) instance = new LinkTouchMovementMethod(); return instance; } @Override public boolean onTouchEvent(TextView textView, Spannable spannable, MotionEvent event) { boolean handled = false; if (event.getAction() == MotionEvent.ACTION_DOWN) { pressedSpan = getPressedSpan(textView, spannable, event); if (pressedSpan != null) { pressedSpan.setPressed(true); Selection.setSelection(spannable, spannable.getSpanStart(pressedSpan), spannable.getSpanEnd(pressedSpan)); handled = true; } } else if (event.getAction() == MotionEvent.ACTION_MOVE) { TouchableUrlSpan touchedSpan = getPressedSpan(textView, spannable, event); if (pressedSpan != null && touchedSpan != pressedSpan) { pressedSpan.setPressed(false); pressedSpan = null; Selection.removeSelection(spannable); } } else { if (pressedSpan != null) { pressedSpan.setPressed(false); super.onTouchEvent(textView, spannable, event); handled = true; } pressedSpan = null; Selection.removeSelection(spannable); } return handled; } private TouchableUrlSpan getPressedSpan(TextView textView, Spannable spannable, MotionEvent event) { int x = (int) event.getX(); int y = (int) event.getY(); x -= textView.getTotalPaddingLeft(); y -= textView.getTotalPaddingTop(); x += textView.getScrollX(); y += textView.getScrollY(); Layout layout = textView.getLayout(); int line = layout.getLineForVertical(y); int off = layout.getOffsetForHorizontal(line, x); TouchableUrlSpan[] link = spannable.getSpans(off, off, TouchableUrlSpan.class); TouchableUrlSpan touchedSpan = null; if (link.length > 0) { touchedSpan = link[0]; } return touchedSpan; } 

}

Cree un archivo de recursos XML en res / drawable / my_background.xml

 <?xml version="1.0" encoding="utf-8"?> <selector xmlns:android="http://schemas.android.com/apk/res/android"> <item android:state_pressed="true" > <shape> <solid android:color="#343434" /> </shape> </item> </selector> 

Y establecerlo en su TextView como fondo, como

  <TextView android:id="@+id/tvMytv" android:layout_width="wrap_content" android:layout_height="wrap_content" android:background="@drawable/my_background" /> 
  • Ellipse de líneas individuales de SpannableString en un TextView
  • AppCompat v22: Establecer el color de texto predeterminado para TextView
  • Cómo obtener el texto ellipsizado en un TextView
  • Android TextView SetText () detiene la marquesina de otro TextView - solución?
  • ¿Cómo se desplaza el texto con el buscador?
  • Debe utilizar "sp" en lugar de "dp" para los tamaños de texto
  • Agregar una fuente personalizada para la aplicación completa de Android
  • Copiar texto de TextView en Android
  • Fuente urdu en la vista de texto
  • Texto de TextView de Android Trunca el comportamiento
  • HTML.fromHtml Saltos de línea que desaparecen
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.