Удалить подчеркивание из ссылок в TextView - Android
Я использую два textview
для отображения ссылок из базы данных, мне удалось изменить цвета ссылок, но я хочу удалить подчеркивание
email.setText(c.getString(5));
website.setText(c.getString(6));
Linkify.addLinks(email, Linkify.ALL);
Linkify.addLinks(website, Linkify.ALL);
Могу ли я сделать это из XML или кода?
Ответы
Ответ 1
Вы можете сделать это в коде, найдя и заменив экземпляры URLSpan
версиями, которые не подчеркивают. После вызова Linkify.addLinks()
вызовите функцию stripUnderlines()
, вставленную ниже на каждый из ваших TextView
s:
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:
private class URLSpanNoUnderline extends URLSpan {
public URLSpanNoUnderline(String url) {
super(url);
}
@Override public void updateDrawState(TextPaint ds) {
super.updateDrawState(ds);
ds.setUnderlineText(false);
}
}
Ответ 2
С учетом 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());
Ответ 3
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);
}
Ответ 4
Всякий раз, попробуйте удалить подчеркивание URL с помощью spannable am, я предлагаю только следующие вещи:
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 со спанимым текстом:
spannableText.setSpan(new URLSpanNoUnderline(UrlText), 0, UrlText.length() , 0);
Здесь spannableText находится объект SpannableString...!!!
Ответ 5
Я реализовал решение, которое, на мой взгляд, более элегантно. Я создал пользовательский 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);
}
}
Ответ 6
Если вы используете свойство autolink Textview и хотите удалить подчеркивания, вы можете использовать его:
Во-первых, расширьте UnderlineSpan и удалите подчеркивание:
public class NoUnderlineSpan extends UnderlineSpan {
@Override
public void updateDrawState(TextPaint ds) {
ds.setUnderlineText(false);
}
}
Во-вторых, создайте и создайте экземпляр NoUnderlineSpan, создайте Spannable из текста String и установите 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
Ответ 7
Если вы просто хотите текст и не беспокоитесь о ссылке URL
Это будет STRIP ссылка, но ХРАНИТЕ текст
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));
Ответ 8
Вот мой метод
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 - это мой класс приложения, где я помещаю этот метод, чтобы я мог получить к нему доступ из любого места
Ответ 9
Для пользователей Xamarin, которые находят этот пост, вот как я заставил его работать:
-
Создайте пользовательский класс span для обработки подчеркивания.
class URLSpanNoUnderline: URLSpan {общедоступный URLSpanNoUnderline (строковый URL): базовый (URL) {}
public override void UpdateDrawState (TextPaint ds) {
base.UpdateDrawState (ds);
ds.UnderlineText = false;
}
}
-
Создайте метод расширения, чтобы найти все диапазоны URL-адресов и заменить их нашими пользовательскими интервалами.
public static void StripUnderlinesFromLinks (это TextView textView) {var spannable = new SpannableStringBuilder (textView.TextFormatted); var spans = spannable.GetSpans(0, spannable.Length(), Java.Lang.Class.FromType(typeof (URLSpan))); var spans = spannable.GetSpans(0, spannable.Length(), Java.Lang.Class.FromType(typeof (URLSpan))); foreach (URLSpan span in spans) { var start = spannable.GetSpanStart(span); foreach (диапазон URLSpan в промежутках) {var start = spannable.GetSpanStart(span); var end = spannable.GetSpanEnd(span); var end = spannable.GetSpanEnd(span); spannable.RemoveSpan(span); spannable.RemoveSpan (диапазон); var newSpan = new URLSpanNoUnderline (span.URL); var newSpan = new URLSpanNoUnderline (span.URL); spannable.SetSpan(newSpan, start, end, 0); spannable.SetSpan(newSpan, start, end, 0); } textView.TextFormatted = spannable; } textView.TextFormatted = spannable; }
Ответ 10
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);
}
}
Ответ 11
Подчеркивание в android: autoLink можно удалить с помощью android: textAllCaps = "true" и android: textIsSelectable = "false"
<TextView
android:autoLink="phone"
android:text="070 300 1155"
android:textAllCaps="true"
android:textIsSelectable="false"
/>