Palabra que se puede hacer clic en TextView en android

Tengo TextView con el texto que cambió dinámicamente. Este texto contiene cadenas como <a href='myWord'>myWord</a> . Quiero que después de hacer clic en este "enlace" myWord aparecer en el EditText en la misma actividad.

Este es mi código:

 txt.setText(Html.fromHtml("...<a href='link'>link</a>...")); txt.setMovementMethod(LinkMovementMethod.getInstance()); 

Su trabajo bien para las URL dentro del atributo href, pero hay un error para otro formato.

He encontrado un montón de preguntas similares en el StackOverflow, pero todos ellos eran sobre url enlaces. En mi aplicación quiero crear "enlace" dentro de la actividad. En general, puedo cambiar de etiqueta a otro si es dependen …

¡Por favor, ayúdame! ¡Gracias!

—– SOLUCIONADO —– ¡Gracias Jacob Phillips por la idea!

Que sea interesante alguien en el futuro. Este es un código:

 //This is my string; String str = "<b>Text</b> which contains one <a href='#'>link</a> and another <a href='#'>link</a>"; //TextView; TextView txt = new TextView(this); //Split string to parts: String[] devFull = data[v.getId()][1].split("<a href='#'>"); //Adding first part: txt.append(Html.fromHtml(devFull[0])); //Creating array for parts with links (they amount always will devFull.length-1): SpannableString[] link = new SpannableString[devFull.length-1]; //local vars: ClickableSpan[] cs = new ClickableSpan[devFull.length-1]; String linkWord; String[] devDevFull = new String[2]; for(int i=1; i<devFull.length; i++){ //obtaining 'clear' link devDevFull = devFull[i].split("</a>"); link[i-1] = new SpannableString(devDevFull[0]); linkWord = devDevFull[0]; cs[i-1] = new ClickableSpan(){ private String w = linkWord; @Override public void onClick(View widget) { // here you can use w (linkWord) } }; link[i-1].setSpan(cs[i-1], 0, linkWord.length(), 0); txt.append(link[i-1]); try{ txt.append(Html.fromHtml(devDevFull[1])); } catch(Exception e){} } 

Esto debería funcionar. Simplemente cambie el texto de su edittext en OnClickListener . Puede ser capaz de ser reducido, pero esto debería funcionar.

 private void foo() { SpannableString link = makeLinkSpan("click here", new View.OnClickListener() { @Override public void onClick(View v) { // respond to click } }); // We need a TextView instance. TextView tv = new TextView(context); // Set the TextView's text tv.setText("To perform action, "); // Append the link we created above using a function defined below. tv.append(link); // Append a period (this will not be a link). tv.append("."); // This line makes the link clickable! makeLinksFocusable(tv); } /* * Methods used above. */ private SpannableString makeLinkSpan(CharSequence text, View.OnClickListener listener) { SpannableString link = new SpannableString(text); link.setSpan(new ClickableString(listener), 0, text.length(), SpannableString.SPAN_INCLUSIVE_EXCLUSIVE); return link; } private void makeLinksFocusable(TextView tv) { MovementMethod m = tv.getMovementMethod(); if ((m == null) || !(m instanceof LinkMovementMethod)) { if (tv.getLinksClickable()) { tv.setMovementMethod(LinkMovementMethod.getInstance()); } } } /* * ClickableString class */ private static class ClickableString extends ClickableSpan { private View.OnClickListener mListener; public ClickableString(View.OnClickListener listener) { mListener = listener; } @Override public void onClick(View v) { mListener.onClick(v); } } 

Mejor enfoque es

  SpannableString ss = new SpannableString("Android is a Software stack"); ClickableSpan clickableSpan = new ClickableSpan() { @Override public void onClick(View textView) { startActivity(new Intent(MyActivity.this, NextActivity.class)); } }; ss.setSpan(clickableSpan, 22, 27, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); //where 22 and 27 are the starting and ending index of the String. Now word stack is clickable // onClicking stack it will open NextActiivty TextView textView = (TextView) findViewById(R.id.hello); textView.setText(ss); textView.setMovementMethod(LinkMovementMethod.getInstance()); 

La mejor solución que conozco es crear su propia clase Button. Usted podría hacer que el botón tenga un fondo transparente de modo que solamente el texto sea visto por el usuario. Luego, cuando se presiona el botón, cambia el TextColor y el TextStyle del botón para que sean de un color más oscuro y subrayados. Esto funcionará exactamente como lo hace un enlace. A continuación, puede utilizar startActivity para ir a la actividad apropiada. No debe utilizar hipervínculos para conectarse a otras actividades dentro de su aplicación.

Mi opinión personal sería hacer una segunda vista de texto que contiene el texto que desea ser su enlace. Entonces usted podría hacer su acción en el onClick de este segundo textView. También como zzzzzzzzzzz indicado arriba, usted podría elegir cambiar las propiedades de la fuente de ese texto a lo que usted quiera una vez que se ha hecho clic.

Hacerla respuesta completa con respuestas de mezcla;

 private void textAreaInit() { String str = "<a href='#'>Link 1</a> and <a href='#'>Link2</a> is here."; TextView tv = mConfirmText; String[] devFull = str.split("<a href='#'>"); tv.append(Html.fromHtml(devFull[0])); SpannableString[] link = new SpannableString[devFull.length-1]; ClickableSpan[] cs = new ClickableSpan[devFull.length-1]; String linkWord; String[] devDevFull = new String[2]; for(int i=1; i<devFull.length; i++) { //obtaining 'clear' link devDevFull = devFull[i].split("</a>"); link[i-1] = new SpannableString(devDevFull[0]); linkWord = devDevFull[0]; final String a = linkWord; cs[i-1] = new ClickableSpan() { private String w = a; @Override public void onClick(View widget) { if(w.equals("Link 1")) { Intent intent = new Intent(PrintPropertiesActivity.this, ViewerAcivity.class); intent.putExtra("title", "Link1"); intent.putExtra("uri", "link1"); intent.putExtra("type", "1"); startActivity(intent); } else { Intent intent = new Intent(PrintPropertiesActivity.this, ViewerAcivity.class); intent.putExtra("title", "Link2"); intent.putExtra("uri", "link2"); intent.putExtra("type", "2"); startActivity(intent); } } }; link[i-1].setSpan(cs[i-1], 0, linkWord.length(), 0); tv.append(link[i-1]); try{ tv.append(Html.fromHtml(devDevFull[1])); } catch(Exception e){} } makeLinksFocusable(tv); } private void makeLinksFocusable(TextView tv) { MovementMethod m = tv.getMovementMethod(); if ((m == null) || !(m instanceof LinkMovementMethod)) { if (tv.getLinksClickable()) { tv.setMovementMethod(LinkMovementMethod.getInstance()); } } } 
  • Actualización de Textview en una actividad con servicio local
  • Evitar que se rompa la palabra en TextView
  • TextView en android sólo muestra dos líneas de texto en cualquier orientación
  • Android: Crear TextView que parpadea cuando se hace clic
  • Android: ¿Cómo usar el Html.TagHandler?
  • Tamaño de texto de Android por programa demasiado grande
  • Textview.getLineCount siempre 0 en android
  • El identificador de recursos no puede ser una cadena vacía (en 'texto' con valor '?') En el atributo textAppearance
  • El texto de la vista de texto se desliza hacia abajo en Android 3.0
  • Html.fromHtml () está obsoleto, ¿cuál es la alternativa?
  • Alineación de la línea de base de dos vistas de texto en Android
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.