Удалить подчеркивание из ссылок в TextView-Android
Я использую два textview для отображения ссылок из базы данных мне удалось изменить цвета ссылок, но я хочу удалить подчеркивание
email.setText(c.getString(5));
website.setText(c.getString(6));
Linkify.addLinks(email, Linkify.ALL);
Linkify.addLinks(website, Linkify.ALL);
могу ли я сделать это из XML или кода ?
10 ответов:
вы можете сделать это в коде, найти и заменить
URLSpanэкземпляров с версиями, которые не подчеркивают. После того, как вы позвонитеLinkify.addLinks()вызов функцииstripUnderlines()вставлено ниже на каждом из ваших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); }для этого требуется настроенная версия URLSpan, которая не включает свойство TextPaint "underline":
private class URLSpanNoUnderline extends URLSpan { public URLSpanNoUnderline(String url) { super(url); } @Override public void updateDrawState(TextPaint ds) { super.updateDrawState(ds); ds.setUnderlineText(false); } }
учитывая textView и содержание:
TextView textView = (TextView) findViewById(R.id.your_text_view_id); String content = "your <a href='http://some.url'>html</a> content";вот краткий способ удалить подчеркивания из гиперссылок:
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);это основано на подходе, предложенном robUx4.
для того, чтобы сделать ссылки кликабельными вам также нужно позвонить:
textView.setMovementMethod(LinkMovementMethod.getInstance());
UnderlineSpanуже существует, но может только установить подчеркивание.другое решение состоит в том, чтобы добавить без подчеркивания промежуток на каждом существующем
URLSpan. Таким образом, состояние подчеркивания отключается непосредственно перед рисованием. Таким образом, вы держите вашURLSpan(возможно, пользовательские) классы и все другие стили, установленные в другом месте.public class NoUnderlineSpan extends UnderlineSpan { public NoUnderlineSpan() {} public NoUnderlineSpan(Parcel src) {} @Override public void updateDrawState(TextPaint ds) { ds.setUnderlineText(false); } }вот как вы устанавливаете его без удаления существующего объекта URLSpan:
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); }
всякий раз, когда, попробуйте удалить подчеркивание URL-адресом С spannable я предлагаю только эти вещи :
1> создание пользовательского класса :
private class URLSpanNoUnderline extends URLSpan { public URLSpanNoUnderline(String url) { super(url); } @Override public void updateDrawState(TextPaint ds) { super.updateDrawState(ds); ds.setUnderlineText(false); } }для этого требуется специальная версия URLSpan который не включает свойство TextPaint "подчеркивание"
2> setSpan с spannable текстом:
spannableText.setSpan(new URLSpanNoUnderline(UrlText), 0, UrlText.length() , 0);здесь spannableText является объектом SpannableString...!!!
я реализовал решение, которое, на мой взгляд, более элегантно. Я сделал custom
TextView. Таким образом, вам не нужно выполнять дополнительный код для каждогоTextViewс гиперссылками.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); } } }и код для 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); } }
Если вы используете свойство Textview autolink и хотите удалить подчеркивания, вы можете использовать его:
во-первых, расширить UnderlineSpan и удалить подчеркивание:
public class NoUnderlineSpan extends UnderlineSpan { @Override public void updateDrawState(TextPaint ds) { ds.setUnderlineText(false); } }во-вторых, создайте и экземпляр NoUnderlineSpan, создайте Spannable из текста строки и установите span в 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); }Ссылка:http://prog3.com/sbdm/blog/maosidiaoxian/article/details/39156563
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); } }
Если вы просто хотите текст и не беспокоитесь о ссылке URL
Это прокладки ссылку, но сохранить текст
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; }дополнительные классы не требуются
String content = "<a href='http://stackoverflow.com'>Stack Overflow</a> Rocks!"; textView.setText(stripLinks(content));
вот мой метод
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); } } }назовем это так
AppController.removeUnderlines((Spannable) eventEmail.getText());Appcontroller - это мой класс приложений, где я помещаю этот метод, чтобы я мог получить к нему доступ из любого места
подчеркивание android: autoLink можно удалить с помощью android: textAllCaps= "true" и android: textIsSelectable= "false"
<TextView android:autoLink="phone" android:text="070 300 1155" android:textAllCaps="true" android:textIsSelectable="false" />
Comments