Eliminar el subrayado de los enlaces en TextView – Android

Estoy usando dos textview para mostrar los enlaces de la base de datos, logré cambiar los colores del enlace, pero quiero eliminar el subrayado

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

¿Puedo hacer eso desde XML o Code?

Puede hacerlo en código buscando y reemplazando las instancias de URLSpan con versiones que no se destacan. Después de llamar a Linkify.addLinks() , llame a la función stripUnderlines() pegada a continuación en cada una 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 habilita la propiedad “subrayado” de TextPaint:

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

Dado un textView y contenido:

 TextView textView = (TextView) findViewById(R.id.your_text_view_id); String content = "your html content"; 

Aquí hay una forma concisa para eliminar los subrayados de los 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.

Para poder hacer clic en los enlaces, también debe llamar:

 textView.setMovementMethod(LinkMovementMethod.getInstance()); 

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 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 configuraste sin eliminar el objeto URLSpan existente:

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

Cuando sea, intente eliminar el subrayado de URL con spannable am, sugiero solo estas cosas:

1> Creando clases personalizadas:

 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 habilita la propiedad “subrayado” de TextPaint

2> setSpan con texto interactivo:

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

Aquí, spannableText es un objeto de SpannableString … !!!

Implementé una solución que, en mi opinión, es más elegante. He hecho un TextView personalizado . 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 codifique 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); } } 

Si está utilizando la propiedad de enlace automático de Textview y desea eliminar los subrayados, puede usarla:

Primero, extienda UnderlineSpan y elimine el subrayado:

 public class NoUnderlineSpan extends UnderlineSpan { @Override public void updateDrawState(TextPaint ds) { ds.setUnderlineText(false); } } 

Segundo, crea una instancia de NoUnderlineSpan, crea un Spannable desde el texto String y establece 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

Si solo quieres el texto y no te molestes sobre el enlace URL

Esto STRIP 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 se requieren clases adicionales

 String content = "Stack Overflow Rocks!"; textView.setText(stripLinks(content)); 

Aquí está 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); } } } 

Llámalo así

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

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

Subrayado en android: autoLink se puede eliminar usando android: textAllCaps = “true” y android: textIsSelectable = “false”