webentwicklung-frage-antwort-db.com.de

Entfernen Sie die Unterstreichung von Links in TextView - Android

Ich verwende zwei textview, um Links aus der Datenbank anzuzeigen. Es ist mir gelungen, die Linkfarben zu ändern, aber ich möchte die Unterstreichung entfernen

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

Kann ich das von XML oder Code machen?

79

Sie können dies im Code tun, indem Sie die URLSpan-Instanzen durch Versionen suchen und ersetzen, die nicht unterstrichen sind. Rufen Sie nach dem Aufruf von Linkify.addLinks() die unten eingebettete Funktion stripUnderlines() für jede Ihrer TextViews auf:

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

Dies erfordert eine angepasste Version von URLSpan, die die Eigenschaft "Unterstrichen" von TextPaint nicht aktiviert:

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

Vorgegebene Textansicht und Inhalt:

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

Hier können Sie auf einfache Weise Unterstreichungen von Hyperlinks entfernen:

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

Dies basiert auf dem von robUx4 vorgeschlagenen Ansatz.

Um die Links anklickbar zu machen, müssen Sie auch anrufen: 

textView.setMovementMethod(LinkMovementMethod.getInstance());
25
Adriaan Koster

UnderlineSpan ist bereits vorhanden, kann jedoch nur die Unterstreichung festlegen.

Eine andere Lösung besteht darin, jeder vorhandenen URLSpan einen Unterstrich ohne Unterstrich hinzuzufügen. Der Unterstreichungszustand wird also kurz vor dem Malen deaktiviert. Auf diese Weise behalten Sie Ihre URLSpan (möglicherweise benutzerdefinierten) Klassen und alle anderen an anderer Stelle festgelegten Stile bei.

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

    public NoUnderlineSpan(Parcel src) {}

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

So legen Sie es fest, ohne das vorhandene URLSpan-Objekt zu entfernen:

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

Versuchen Sie immer, URL unterstrichen zu entfernen mit spannbar Ich schlage nur folgende Dinge vor:

1> Benutzerdefinierte Klasse erstellen:

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

Dies erfordert eine angepasste Version von URLSpan , die die "Underline" -Eigenschaft von TextPaint nicht aktiviert

2> setSpan mit spannbarem Text:

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

Hier ist spannableText ist Objekt von SpannableString ... !!!

2
Dhruv Raval

Ich habe eine Lösung implementiert, die meiner Meinung nach eleganter ist. Ich habe eine benutzerdefinierte TextViewgemacht. Auf diese Weise müssen Sie keinen zusätzlichen Code für jede TextView mit Hyperlinks ..__ ausführen.

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

Und Code für 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);
    }
}
2
Sam Sunson

Wenn Sie die autolink-Eigenschaft Textview verwenden und Unterstriche entfernen möchten, können Sie diese verwenden:

Erweitern Sie zunächst UnderlineSpan und entfernen Sie die Unterstreichung:

public class NoUnderlineSpan extends UnderlineSpan {

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

Zweitens erstellen Sie eine Instanz von NoUnderlineSpan, erstellen Sie aus dem String-Text ein Spannbares und legen Sie die Spannweite auf das Spannbare fest:

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

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

1
Francisco Moya

Hier ist meine Methode 

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

Nenne es so 

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

Appcontroller ist meine Anwendungsklasse, in der ich diese Methode stelle, um von überall darauf zugreifen zu können

0
Bharat singh

Wenn Sie nur den Text wünschen und sich nicht um den URL-Link kümmern müssen 

Dadurch wirdSTRIPder Link aber den Text behalten

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

keine zusätzlichen klassen erforderlich

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

Für Xamarin-Benutzer, die diesen Beitrag gefunden haben, habe ich ihn so zum Laufen gebracht:

  1. Erstellen Sie eine benutzerdefinierte Bereichsklasse, um die Unterstriche zu entfernen.

    klasse URLSpanNoUnderline: URLSpan { public URLSpanNoUnderline (string url): base (url) { }

        public override void UpdateDrawState (TextPaint ds) {
            base.UpdateDrawState (ds);
            ds.UnderlineText = false;
        }
    }
    
  2. Erstellen Sie eine Erweiterungsmethode, um alle URL-Bereiche zu finden und durch unsere benutzerdefinierten Bereiche zu ersetzen.

    public static void StripUnderlinesFromLinks (diese TextView-Textansicht) { var spannable = neuer SpannableStringBuilder (textView.TextFormatted); var spans = spannable.GetSpans (0, spannable.Length (), Java.Lang.Class.FromType (typeof (URLSpan))); foreach (URLSpan Spannweite in Bereichen) { var start = spannable.GetSpanStart (span); var end = spannbar.GetSpanEnd (span); spannable.RemoveSpan (Span); var newSpan = neue URLSpanNoUnderline (span.URL); spannable.SetSpan (newSpan, Start, Ende, 0); } textView.TextFormatted = spannbar; }

0
Justin