¿Cómo hacer clic o tocar en un texto TextView en diferentes palabras?

Cómo desplazarse a otra vista haciendo clic en la vista de texto con dos palabras diferentes. Esta es la cadena que estoy usando.

By clicking Sign Up, you are indicating that you have read and agree to the Term of Use and Privacy Policy. 

Quiero hacer estas dos palabras (término de uso, política de privacidad) en color diferente y clickable ..

Sé ho para hacer el color de una palabra en particular. Quiero hacer clicable.

Finalmente me di cuenta de cómo tener varias partes que se pueden hacer clic en un TextView. ¡Es importante que todos ellos tengan su propio ClickableSpan! Ahí es donde me equivoqué la primera vez que lo probé. Si tienen la misma instancia ClickableSpan, sólo se recuerda el último intervalo establecido.

He creado una cadena con el área clicable requerida rodeada de "[" y "]".

 String sentence = "this is [part 1] and [here another] and [another one]"; 

Y aquí está el conjunto TextView, el setMovementMehthod también es obligatorio:

 textView.setMovementMethod(LinkMovementMethod.getInstance()); textView.setText(addClickablePart(sentence), BufferType.SPANNABLE); 

He creado esta función, que manejará la creación del área clickable:

 private SpannableStringBuilder addClickablePart(String str) { SpannableStringBuilder ssb = new SpannableStringBuilder(str); int idx1 = str.indexOf("["); int idx2 = 0; while (idx1 != -1) { idx2 = str.indexOf("]", idx1) + 1; final String clickString = str.substring(idx1, idx2); ssb.setSpan(new ClickableSpan() { @Override public void onClick(View widget) { Toast.makeText(getView().getContext(), clickString, Toast.LENGTH_SHORT).show(); } }, idx1, idx2, 0); idx1 = str.indexOf("[", idx2); } return ssb; } 

Basándome en la respuesta de Boy (y gracias por tu respuesta, que me ayudó mucho), aquí hay otra forma en la que implementé sin estos caracteres '[' y ']' usando una clase interna para describir palabras que se pueden hacer clic:

 import java.util.List; import android.content.Context; import android.text.SpannableStringBuilder; import android.text.method.LinkMovementMethod; import android.text.style.ClickableSpan; import android.util.AttributeSet; import android.widget.TextView; /** * Defines a TextView widget where user can click on different words to see different actions * */ public class ClickableTextView extends TextView { public ClickableTextView(Context context) { super(context); } public ClickableTextView(Context context, AttributeSet attrs) { super(context, attrs); } public ClickableTextView(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); } public void setTextWithClickableWords(String text, List<ClickableWord> clickableWords) { setMovementMethod(LinkMovementMethod.getInstance()); setText(addClickablePart(text, clickableWords), BufferType.SPANNABLE); } private SpannableStringBuilder addClickablePart(String str, List<ClickableWord> clickableWords) { SpannableStringBuilder ssb = new SpannableStringBuilder(str); for (ClickableWord clickableWord : clickableWords) { int idx1 = str.indexOf(clickableWord.getWord()); int idx2 = 0; while (idx1 != -1) { idx2 = idx1 + clickableWord.getWord().length(); ssb.setSpan(clickableWord.getClickableSpan(), idx1, idx2, 0); idx1 = str.indexOf(clickableWord.getWord(), idx2); } } return ssb; } public static class ClickableWord { private String word; private ClickableSpan clickableSpan; public ClickableWord(String word, ClickableSpan clickableSpan) { this.word = word; this.clickableSpan = clickableSpan; } /** * @return the word */ public String getWord() { return word; } /** * @return the clickableSpan */ public ClickableSpan getClickableSpan() { return clickableSpan; } } } 

Espero que esto pueda ayudar a alguien

EDIT: cómo cambiar el color del enlace y eliminar el subrayado:

Crear y utilizar su propia implementación de ClickableSpan como este:

 //a version of ClickableSpan without the underline public static class NoUnderlineClickableSpan extends ClickableSpan { private int color = -1; public void setColor(int color) { this.color = color; } @Override public void updateDrawState(TextPaint ds) { ds.setUnderlineText(false); if (this.color != -1) { ds.setColor(this.color); } } } 

Es mucho más sencillo usar HTML con vínculos en TextView que crear múltiples TextViews, teniendo cuidado con el diseño, los oyentes, etc.

En su actividad o fragmento:

  TextView mText = (TextView) findViewById(R.id.text_linkified); mText.setText(Html.fromHtml("Open <a href='myapp://my-activity'>My Activity</a> or" + " <a href='myapp://other-activity'>Other Activity</a>")); mText.setMovementMethod(LinkMovementMethod.getInstance()); 

En manifiesto

  <activity android:name=".MyActivity"> <intent-filter> <action android:name="android.intent.action.VIEW" /> <category android:name="android.intent.category.DEFAULT"/> <data android:scheme="myapp" android:host="my-activity"/> </intent-filter> </activity> <activity android:name=".MyOtherActivity"> <intent-filter> <action android:name="android.intent.action.VIEW" /> <category android:name="android.intent.category.DEFAULT"/> <data android:scheme="myapp" android:host="other-activity" /> </intent-filter> </activity> 

Recomiendo esta biblioteca: https://github.com/klinker24/Android-TextView-LinkBuilder

Cabe su requisito muy bien.

Un resumen rápido:

Introduzca aquí la descripción de la imagen

Copiado formulario proyecto readme:

  • Especifique las acciones de clic largo y corto de una palabra específica dentro de su TextView
  • Proporcionar comentarios de los usuarios resaltando el texto cuando el usuario lo toca Combinar cadenas individuales o usar una expresión regular para establecer vínculos que se pueden hacer clic en cualquier texto que se ajuste a ese patrón
  • Cambiar el color del texto vinculado
  • Modificar la transparencia del resaltado del texto cuando el usuario lo toca
  • Establezca si desea o no el texto subrayado

La principal ventaja de usar esta biblioteca sobre la funcionalidad de autolink de TextView es que puedes vincular cualquier cosa, no solo direcciones web, correos electrónicos y números de teléfono. También proporciona personalización de color y retroalimentación por contacto.

En la implementación de ClickableTextView, ¿qué sucede si string obtuvo una palabra con repeat? Supongamos que por ejemplo la cadena es "soy clicable y también es clickable" entonces ambas cadenas deben ser cambiadas a cadena Spannable pero falla en ese escenario, solo una será cambiada a cadena spannable.

  • Convertir el número en textview en int
  • Cómo evitar que las URL se envuelvan en TextView?
  • Android Horizontal LinearLayout - Envolver elementos
  • ¿Cómo crear sugerencias en el cuadro de edición textview que desaparecen cuando textview tiene foco?
  • HTML.fromHtml Saltos de línea que desaparecen
  • Android - epub reader para leer archivos .epub ..
  • El texto largo pasa a la siguiente línea en ICS, pero no en GB y debajo
  • TextView diferentes formas de añadir dibujable
  • Android setMovementMethod en un TextView dentro de un ListView
  • ¿Cómo mostrar el archivo .rtf dentro de TextView?
  • El salto de línea en Android agrega relleno
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.