2010-11-04 13 views
71

estoy usando dos textview para mostrar los enlaces de base de datos, que logró cambiar colores de los enlaces, pero quiero quitar el subrayadoQuitar subrayado de los enlaces en TextView - Android

email.setText(c.getString(5)); 
    website.setText(c.getString(6)); 
    Linkify.addLinks(email, Linkify.ALL); 
    Linkify.addLinks(website, Linkify.ALL); 

¿Puedo hacerlo desde XML o Código ?

Respuesta

182

Puede hacerlo en código encontrando y reemplazando las instancias URLSpan con versiones que no se subrayan. Después de llamar Linkify.addLinks(), llamar a la función stripUnderlines() pegado a continuación en cada uno de sus TextView s:

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); 
    } 

Esto requiere una versión personalizada de URLSpan que no permite el TextPaint "underline" propiedad:

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

Esta solución supone que el texto de la amplitud es la misma que la URL el caso de un enlace http: // básico. Sin embargo, Linkify es inteligente y convierte un número de teléfono como (212) 555-1212 en la URL 'tel: 2125551212'. La llamada 'nueva URLSpanNoUnderline' se debe pasar' span.getURL() 'para retener esta información, de lo contrario generará enlaces defectuosos que causen excepciones cuando se haga clic. He colocado esta solución propuesta en la cola de edición para su respuesta, ya que no tengo permisos de edición. –

+0

Saludos Mike. Aprobé tu edición, la primera vez que * he visto * ese diálogo de edición, espero que haya funcionado. –

+0

¿Qué significa "texto del lapso igual a la URL"? –

10

UnderlineSpan ya existe, pero solo puede establecer el subrayado.

Otra solución es agregar un tramo sin subrayado en cada URLSpan existente. Por lo tanto, el estado de subrayado está desactivado justo antes de pintar. De esta forma, mantendrá sus clases URLSpan (posiblemente personalizadas) y todos los demás estilos establecidos en otro lugar.

public class NoUnderlineSpan extends UnderlineSpan { 
    public NoUnderlineSpan() {} 

    public NoUnderlineSpan(Parcel src) {} 

    @Override 
    public void updateDrawState(TextPaint ds) { 
     ds.setUnderlineText(false); 
    } 
} 

Así es como lo establece sin necesidad de retirar el objeto existente URLSpan:

URLSpan[] spans = s.getSpans(0, s.length(), URLSpan.class); 
for (URLSpan span: spans) { 
    int start = s.getSpanStart(span); 
    int end = s.getSpanEnd(span); 
    NoUnderlineSpan noUnderline = new NoUnderlineSpan(); 
    s.setSpan(noUnderline, start, end, 0); 
} 
19

Dado un TextView y contenido:

TextView textView = (TextView) findViewById(R.id.your_text_view_id); 
String content = "your <a href='http://some.url'>html</a> content"; 

Aquí es una manera concisa para eliminar los subrayados de hipervínculos :

Spannable s = (Spannable) Html.fromHtml(content); 
for (URLSpan u: s.getSpans(0, s.length(), URLSpan.class)) { 
    s.setSpan(new UnderlineSpan() { 
     public void updateDrawState(TextPaint tp) { 
      tp.setUnderlineText(false); 
     } 
    }, s.getSpanStart(u), s.getSpanEnd(u), 0); 
} 
textView.setText(s); 

Esto se basa en el enfoque sugerido por robUx4.

Con el fin de hacer que los enlaces se puede hacer clic también hay que llamar:

textView.setMovementMethod(LinkMovementMethod.getInstance()); 
+3

esto no funciona si se intenta obtener una cadena de recursos, por lo que 'contenido String = getResources() GetString (R.string.content);.' Que incluye un enlace ya no funciona. –

+0

¿Cómo puede ser eso? Una cadena no sabe de dónde se originó. Debe haber una diferencia en el contenido de la cadena. –

+0

no está seguro de por qué, pero no muestra la dirección URL cuando llamo a la cadena de 'res/valores/strings.xml' que contiene exactamente el mismo que el ejemplo. ¿Puedes probar en tu final? –

2

Cada vez, tratar de URL quitar subrayar con spannable soy yo sugiero sólo estas cosas:

1>Creación clase personalizada:

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

Esto requiere una versión personalizada de URLSpan que no permite el TextPaint "underline" propiedad

2>setSpan con el texto spannable:

spannableText.setSpan(new URLSpanNoUnderline(UrlText), 0, UrlText.length() , 0); 

Aquí, spannableText es objeto de SpannableString ... !! !

+0

Esta es la mejor solución y la única que funcionó para mí – GuilhE

0
public void setView() 
{ 
TextView t=(TextView) findViewById(R.id.textView3); 
     t.setText(Html.fromHtml("<a href=http://www.urdusms.net > UrduSMS ")); 
     t.setTextColor(Color.BLACK); 
     t.setGravity(Gravity.CENTER); 
     t.setMovementMethod(LinkMovementMethod.getInstance()); 

     Spannable s = (Spannable) t.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 URLSpanline_none(span.getURL()); 
       s.setSpan(span, start, end, 0); 
      } 
     t.setText(s); 
} 
//inner class is  
private class URLSpanline_none extends URLSpan { 
      public URLSpanline_none(String url) { 
       super(url); 
      } 
      @Override public void updateDrawState(TextPaint ds) { 
       super.updateDrawState(ds); 
       ds.setUnderlineText(false); 
      } 
     } 
1

Implementé una solución que, en mi opinión, es más elegante. He hecho un personalizado TextView. De esta forma no es necesario ejecutar código adicional para cada TextView con hipervínculos.

package com.example.view; 

import android.content.Context; 
import android.support.v7.widget.AppCompatTextView; 
import android.text.Spannable; 
import android.text.SpannableString; 
import android.text.style.URLSpan; 
import android.util.AttributeSet; 

import com.example.utils.UrlSpanNoUnderline; 

public class TextViewNoUnderline extends AppCompatTextView { 
    public TextViewNoUnderline(Context context) { 
     this(context, null); 
    } 

    public TextViewNoUnderline(Context context, AttributeSet attrs) { 
     this(context, attrs, android.R.attr.textViewStyle); 
    } 

    public TextViewNoUnderline(Context context, AttributeSet attrs, int defStyleAttr) { 
     super(context, attrs, defStyleAttr); 
     setSpannableFactory(Factory.getInstance()); 
    } 

    private static class Factory extends Spannable.Factory { 
     private final static Factory sInstance = new Factory(); 

     public static Factory getInstance() { 
      return sInstance; 
     } 

     @Override 
     public Spannable newSpannable(CharSequence source) { 
      return new SpannableNoUnderline(source); 
     } 
    } 

    private static class SpannableNoUnderline extends SpannableString { 
     public SpannableNoUnderline(CharSequence source) { 
      super(source); 
     } 

     @Override 
     public void setSpan(Object what, int start, int end, int flags) { 
      if (what instanceof URLSpan) { 
       what = new UrlSpanNoUnderline((URLSpan) what); 
      } 
      super.setSpan(what, start, end, flags); 
     } 
    } 
} 

Y código para UrlSpanNoUnderline:

package com.jankstudios.smmagazine.utils; 

import android.text.TextPaint; 
import android.text.style.URLSpan; 

public class UrlSpanNoUnderline extends URLSpan { 
    public UrlSpanNoUnderline(URLSpan src) { 
     super(src.getURL()); 
    } 

    @Override 
    public void updateDrawState(TextPaint ds) { 
     super.updateDrawState(ds); 
     ds.setUnderlineText(false); 
    } 
} 
0

Si lo que desea el texto y no se preocupen por el enlace URL

Esto hará TIRA el enlace pero MANTENER el texto

private Spannable stripLinks(String content) { 
    Spannable s = new SpannableString(content); 
    URLSpan[] spans = s.getSpans(0, s.length(), URLSpan.class); 
    for (URLSpan span : spans) { 
     s.removeSpan(span); 
    } 

    return s; 
} 

no hay clases adicionales necesarios

String content = "<a href='http://stackoverflow.com'>Stack Overflow</a> Rocks!"; 
textView.setText(stripLinks(content)); 
1

Si está utilizando la propiedad autolink Textview y que desea eliminar subraya que se puede utilizar:

En primer lugar, se extienden UnderlineSpan y retire subrayado:

public class NoUnderlineSpan extends UnderlineSpan { 

    @Override 
    public void updateDrawState(TextPaint ds) { 
     ds.setUnderlineText(false); 
    } 
} 

En segundo lugar, cree una instancia de NoUnderlineSpan, cree un Spannable desde el texto String y establezca el span en el spannable:

NoUnderlineSpan mNoUnderlineSpan = new NoUnderline(); 
if (yourTextView.getText() instanceof Spannable) { 
    Spannable s = (Spannable) yourTextView.getText(); 
    s.setSpan(mNoUnderlineSpan, 0, s.length(), Spanned.SPAN_MARK_MARK); 
} 

Referencia: http://prog3.com/sbdm/blog/maosidiaoxian/article/details/39156563

0

Subrayado en androide: autoLink se puede eliminar usando androide: textAllCaps = "true" y androide: textIsSelectable = "true"

<TextView 
    android:autoLink="phone" 
    android:text="070 300 1155" 
    android:textAllCaps="true" 
    android:textIsSelectable="false" 
    /> 
0

Aquí es Mi método

public static void removeUnderlines(Spannable p_Text) { 
      if (p_Text != null && p_Text.toString().length() > 0) { 
       URLSpan[] spans = p_Text.getSpans(0, p_Text.length(), URLSpan.class); 

       for (URLSpan span : spans) { 
        int start = p_Text.getSpanStart(span); 
        int end = p_Text.getSpanEnd(span); 
        p_Text.removeSpan(span); 
        span = new URLSpanNoUnderline(span.getURL()); 
        p_Text.setSpan(span, start, end, 0); 
       } 
      } 
     } 

lo llama como esto

AppController.removeUnderlines((Spannable) eventEmail.getText()); 

AppControler es mi clase de aplicación donde pongo este método de modo que pueda acceder a él desde cualquier lugar