103 votes

Supprimer le soulignement des liens dans TextView - Android

J'utilise deux textview pour afficher les liens de la base de données. J'ai réussi à changer la couleur des liens mais je souhaite supprimer le soulignement.

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

Puis-je le faire à partir de XML ou de code?

234voto

Reuben Scratton Points 22314

Vous pouvez le faire dans le code en recherchant et en remplaçant les instances URLSpan par des versions qui ne sont pas soulignées. Après avoir appelé Linkify.addLinks() , appelez la fonction stripUnderlines() collée ci-dessous sur chacun de vos TextView s:

     private void stripUnderlines(TextView textView) {
        Spannable s = (Spannable)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);
    }
 

Cela nécessite une version personnalisée de URLSpan qui n'active pas la propriété "underline" 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);
        }
    }
 

35voto

Adriaan Koster Points 6264

Étant donné un textView et le contenu:

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

Voici un moyen concis pour supprimer le soulignement des hyperliens:

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

Ceci est basé sur l'approche suggérée par robUx4.

Afin de rendre les liens cliquables, vous devez également appeler:

 textView.setMovementMethod(LinkMovementMethod.getInstance());
 

11voto

robUx4 Points 161

UnderlineSpan existe déjà, mais ne peut définir que le soulignement.

Une autre solution consiste à ajouter une plage sans soulignement sur chaque URLSpan existant. Ainsi, l'état de soulignement est désactivé juste avant de peindre. De cette façon, vous conservez vos classes URLSpan (éventuellement personnalisées) et tous les autres styles définis ailleurs.

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

    public NoUnderlineSpan(Parcel src) {}

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

Voici comment vous le configurez sans supprimer l'objet URLSpan existant:

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X