studio programacion herramientas fundamentos con avanzado aplicaciones android hyperlink textview underline

programacion - Eliminar el subrayado de los enlaces en TextView-Android



manual de android en pdf (10)

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

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?


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 ... !!!


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í 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());


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


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


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 = "<a href=''http://.com''></a> Rocks!"; textView.setText(stripLinks(content));


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

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


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


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