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?
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 TextView
s 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);
}
}
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());
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);
}
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 ... !!!
Ich habe eine Lösung implementiert, die meiner Meinung nach eleganter ist. Ich habe eine benutzerdefinierte TextView
gemacht. 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);
}
}
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
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
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));
Für Xamarin-Benutzer, die diesen Beitrag gefunden haben, habe ich ihn so zum Laufen gebracht:
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;
}
}
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; }