Frage Entfernen Sie die Unterstreichung von Links in TextView - Android


Ich benutze zwei textview um Links aus der Datenbank anzuzeigen, habe ich die Linkfarben geändert, 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 aus XML oder Code machen?


75
2017-11-04 12:55


Ursprung


Antworten:


Sie können es im Code tun, indem Sie das finden und ersetzen URLSpan Instanzen mit Versionen, die nicht unterstreichen. Nach dem Anruf Linkify.addLinks(), rufe die Funktion auf stripUnderlines() unten auf jedem von Ihnen eingefügt TextViews:

    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 "Unterstreichen" -Eigenschaft 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);
        }
    }

194
2017-12-16 17:18



Gegeben ein textView und Inhalt:

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

Hier ist eine kurze Möglichkeit, um Unterstreichungen von Hyperlinks zu 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());

20
2017-10-02 09:26



UnderlineSpan existiert bereits, kann aber nur die Unterstreichung setzen.

Eine andere Lösung besteht darin, auf jeder vorhandenen Datei eine Unterstreichung ohne Unterstreichung hinzuzufügen URLSpan. Daher wird der Unterstreichungszustand unmittelbar vor dem Malen deaktiviert. Auf diese Weise behalten Sie Ihre URLSpan (möglicherweise benutzerdefinierte) Klassen und alle anderen Stile an anderer Stelle.

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
2018-06-11 11:36



Wann immer, versuch es Entfernen Sie die URL-Unterstreichung mit spannbar bin ich nur auf diese dinge hinweisen:

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 was die Eigenschaft "Unterstreichen" des TextPaint nicht aktiviert

2> setSpan mit spannbarem Text:

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

Hier, spannbarerText ist Gegenstand von SpannableString... !!!


2
2018-01-13 09:05



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

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

1
2017-11-06 10:32



Wenn Sie die Autolink-Eigenschaft Textview verwenden und Unterstreichungen entfernen möchten, können Sie sie verwenden:

Erweitern Sie zuerst UnderlineSpan und entfernen Sie die Unterstreichung:

public class NoUnderlineSpan extends UnderlineSpan {

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

Zweitens, erstellen und Instanz von NoUnderlineSpan, erstellen Sie eine spannbare aus dem Text String und setzen Sie den Bereich auf die spannbare:

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/sbm/blog/maosidiaoxian/article/details/39156563


1
2018-05-17 17:07



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

0
2018-06-05 07:52



Wenn Sie nur den Text möchten und sich nicht um den URL-Link kümmern

Dieser Wille STREIFEN der Link aber BEHALTEN der Text

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
2017-11-04 07:58



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

Nennen Sie es so

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

Appcontroller ist meine Anwendungsklasse, wo ich diese Methode einsetze, damit ich von überall darauf zugreifen kann


0
2017-07-20 07:53



Unterstreichen in Android: AutoLink kann mit entfernt werden android: textAllCaps = "wahr" und android: textIsSelectable = "false"

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

-1
2017-07-18 19:21