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