Using Linkify.addLinks combine with Html.fromHtml

十年热恋 提交于 2019-12-03 12:38:34

It's because Html.fromHtml and Linkify.addLinks removes previous spans before processing the text.

Use this code to get it work:

public static Spannable linkifyHtml(String html, int linkifyMask) {
    Spanned text = Html.fromHtml(html);
    URLSpan[] currentSpans = text.getSpans(0, text.length(), URLSpan.class);

    SpannableString buffer = new SpannableString(text);
    Linkify.addLinks(buffer, linkifyMask);

    for (URLSpan span : currentSpans) {
        int end = text.getSpanEnd(span);
        int start = text.getSpanStart(span);
        buffer.setSpan(span, start, end, 0);
    }
    return buffer;
}

You can try this one:

First set the text in to your TextView.

tv.setText(myText);

Convert the links with Linkify

Linkify.addLinks(tv, Linkify.ALL);

and finally replace the text with Html.fromHtml but using the Linkified text from your EditText.

tv.setText(Html.fromHtml(tv.getText().toString()));

100% works solution (kotlin).

Create class for store HtmlLink before Linkify

class HtmlLink(val urlSpan: URLSpan, val spanStart: Int, val spanEnd: Int)

Create spanned html (both formats for test)

val spanned = Html.fromHtml("https://google.com" +
                "<br><a href=\"https://google.com\">Google</a>")

Store html

val htmlLinks = ArrayList<HtmlLink>()
spanned.getSpans(0, spanned.length, URLSpan::class.java).forEach { urlSpan ->
    htmlLinks.add(HtmlLink(urlSpan, 
                  spanned.getSpanStart(urlSpan),
                  spanned.getSpanEnd(urlSpan)))
}

Create spannable builder and Linkify it

val builder = SpannableString(spanned)
Linkify.addLinks(builder, Linkify.WEB_URLS)

Restore spans.

htmlLinks.forEach { htmlLink ->
    builder.setSpan(URLSpan(htmlLink.urlSpan.url), htmlLink.spanStart, htmlLink.spanEnd, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE)
}

Set finally text

scrollContent.text = builder
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!