2012-03-24 13 views
40

sé que si se pone un enlace en una TextView que va a funcionar, pero si quiero mostrar por ejemplo:Android: Vista de Texto hipervínculo

Google stackoverflow

y no todo el enlace (justo la etiqueta) ¿Cómo puedo hacer que se haga clic en esos enlaces?

+0

Revise esto: http://stackoverflow.com/a/2746708/646391 – Emran

+0

posible duplicado de [¿Cómo puedo hacer enlaces en un TextView que se puede hacer clic?] (Http://stackoverflow.com/questions/2734270/how-do-i-make-links-in-a-textview-clickable) – CAMOBAP

+0

Varias de las respuestas aquí llaman Html.fromHtml, y tampoco usan strings.xml para el hipertexto u ofuscar el hipertexto en el XML (por ejemplo, "<" reemplazando a "<" en el archivo XML). Esto complica innecesariamente las cosas. AFAICT, la respuesta más correcta sería escribir la etiqueta de anclaje HTML directamente en strings.xml, asegurarse de que la propiedad autolink para TextView no esté configurada, luego use setMovementMethod para establecer LinkMovementMethod. Hay un par de respuestas que ya muestran cómo hacer esto. –

Respuesta

58

Usted podría tener dos TextViews separados y que podría alinear en consecuencia en su diseño, si es necesario:

Text1.setText(
     Html.fromHtml(
      "<a href=\"http://www.google.com\">google</a> ")); 
    Text1.setMovementMethod(LinkMovementMethod.getInstance()); 

    Text2.setText(
      Html.fromHtml(
       "<a href=\"http://www.stackoverflow.com\">stackoverflow</a> ")); 
    Text2.setMovementMethod(LinkMovementMethod.getInstance()); 

Entonces, si usted quiere pelar el "enlace subrayado". Crear una clase:

public class URLSpanNoUnderline extends URLSpan { 
    public URLSpanNoUnderline(String url) { 
     super(url); 
    } 
    @Override public void updateDrawState(TextPaint ds) { 
     super.updateDrawState(ds); 
     ds.setUnderlineText(false); 
     } 
} 

A continuación, añadir este método en su clase principal actividad en la que tiene los TextViews

private void stripUnderlines(TextView textView) { 
    Spannable s = new SpannableString(textView.getText()); 
    URLSpan[] spans = s.getSpans(0, s.length(), URLSpan.class); 
    for (URLSpan span: spans) { 
     int start = s.getSpanStart(span); 
     int end = s.getSpanEnd(span); 
     s.removeSpan(span); 
     span = new URLSpanNoUnderline(span.getURL()); 
     s.setSpan(span, start, end, 0); 
    } 
    textView.setText(s); 
} 

Y luego simplemente llamar a esto después de que inicializa los TextViews (en su onCreate):

stripUnderlines(Text1); 
stripUnderlines(Text2); 
+1

Nota: esto ** no ** funcionará si configuró las propiedades de su TextView para autoenlazar algunas propiedades. Si es así, debe llamar a 'textView.setAutoLinkMask (0);' antes de llamar a setText() – Xebozone

5

esto debería funcionar.

TextView t2 = (TextView) findViewById(R.id.text2); 
t2.setMovementMethod(LinkMovementMethod.getInstance()); 

and 

<TextView android:layout_width="wrap_content" 
android:layout_height="wrap_content" android:text="@string/txtCredits" 
android:id="@+id/text2" 
android:layout_centerInParent="true" 
android:layout_marginTop="20dp"></TextView> 
+0

Pero no quiero mostrar todo el enlace –

+0

sí y para eso puede incluir esto en su recurso de cadena Google. –

+0

¡Lo intentaré! ¡Gracias! –

11

Una manera muy simple de hacer esto ---

En su actividad--

TextView tv = (TextView) findViewById(R.id.site); 
tv.setText(Html.fromHtml("<a href=http://www.stackoverflow.com> STACK OVERFLOW ")); 
tv.setMovementMethod(LinkMovementMethod.getInstance()); 

A continuación, obtendrá sólo la etiqueta, no todo el enlace ..

espero que le ayudará a ...

45
TextView t2 = (TextView) findViewById(R.id.textviewidname); 
t2.setMovementMethod(LinkMovementMethod.getInstance()); 

y

<string name="google_stackoverflow"><a href="https://stackoverflow.com/questions/9852184/android-textview-hyperlink?rq=1">google stack overflow</a></string> 

El enlace es, "Android: textview hyperlink"

y la etiqueta es "desbordamiento de la pila de google"

Defina el primer bloque de código en su java y el segundo bloque de código en su archivo strings.xml. Además, asegúrese de hacer referencia a la id de textView desde su diseño de página en su java.

+2

. Me gusta más. En mi humilde opinión, es el más limpio. – plackemacher

+1

Me alegra ser útil. – epicness42

+0

Esto funciona con múltiples enlaces. ej. Ejemplos: Link 1 y Link 2 Peter

2

Ésta es mi aplicación trabaja

private void showMessage() 
    { 

     lblMessage.setText(""); 

     List<String> messages = db.getAllGCMMessages(); 

     for (int k = messages.size() - 1; k >= 0; --k) 
     { 

      String message = messages.get(k).toString(); 
      lblMessage.append(message + "\n\n"); 

     } 
    Linkify.addLinks(lblMessage, Linkify.ALL); 
    } 

y para cambiar el color de los hipervínculos, i Editted mi XML para TextView -

android:textColorLink="#69463d" 
2

di con el mismo problema y, finalmente, encontrar la solución de trabajo.

  1. en la cadena.archivo XML, defina:

    <string name="textWithHtml">The URL link is &lt;a href="http://www.google.com">Google&lt;/a></string> 
    

sustituir a la "<" menos del personaje con HTML escaparon carácter.

  1. en código Java:

    String text = v.getContext().getString(R.string.textWithHtml); 
    textView.setText(Html.fromHtml(text)); 
    textView.setMovementMethod(LinkMovementMethod.getInstance()); 
    

Y el cuadro de texto se mostrará correctamente el texto con el enlace de anclaje se puede hacer clic

7

android:autoLink="web" simplemente funciona si usted tiene enlaces completos en tu HTML. Lo siguiente se resaltará en azul y se puede hacer clic:

Cuestiones relacionadas