Подтвердить что ты не робот

Удалить подчеркивание из ссылок в TextView - Android

Я использую два textview для отображения ссылок из базы данных, мне удалось изменить цвета ссылок, но я хочу удалить подчеркивание

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

Могу ли я сделать это из XML или кода?

4b9b3361

Ответ 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, которые находят этот пост, вот как я заставил его работать:

  1. Создайте пользовательский класс span для обработки подчеркивания.

    class URLSpanNoUnderline: URLSpan {общедоступный URLSpanNoUnderline (строковый URL): базовый (URL) {}

        public override void UpdateDrawState (TextPaint ds) {
            base.UpdateDrawState (ds);
            ds.UnderlineText = false;
        }
    }
    
  2. Создайте метод расширения, чтобы найти все диапазоны 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"
     />