首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Linkify.addLinks(textView、Linkify.WEB_URLS或Linkify.EMAIL_ADDRESSES)在安卓系统中不能协同工作

Linkify.addLinks(textView、Linkify.WEB_URLS或Linkify.EMAIL_ADDRESSES)在安卓系统中不能协同工作
EN

Stack Overflow用户
提问于 2021-02-18 18:17:40
回答 2查看 219关注 0票数 2

我有包含web URL、电子邮件地址和电话号码的HTML内容。当我使用下面的代码时,只有电子邮件地址成为链接,而不是web URL。问题可能是什么?我也尝试过使用Linkify.ALL。但没起作用。

代码语言:javascript
复制
    val htmlSpannable = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
        Html.fromHtml(content, Html.FROM_HTML_MODE_LEGACY)
    } else {
        Html.fromHtml(content)
    }

    val spannableBuilder = SpannableStringBuilder(htmlSpannable)
    val bulletSpans = spannableBuilder.getSpans(
        0,
        spannableBuilder.length,
        BulletSpan::class.java
    )
    bulletSpans.forEach {
        val start = spannableBuilder.getSpanStart(it)
        val end = spannableBuilder.getSpanEnd(it)
        spannableBuilder.removeSpan(it)
        spannableBuilder.setSpan(
            ImprovedBulletSpan(bulletRadius = dip(3, context), gapWidth = dip(8, context)),
            start,
            end,
            Spanned.SPAN_INCLUSIVE_EXCLUSIVE
        )
    }
    
    textView.text = spannableBuilder.trimEnd()
    Linkify.addLinks(textView, Linkify.WEB_URLS or Linkify.EMAIL_ADDRESSES or Linkify.PHONE_NUMBERS)
    textView.movementMethod = LinkMovementMethod.getInstance()
EN

回答 2

Stack Overflow用户

发布于 2021-02-22 22:19:45

Linkify.addLinks删除了现有的UrlSpan,因此在给定的示例中,一旦应用了Linkify,在HTML spannable中生成的链接就会被删除。但是,这两种方法都可以组合使用。首先,从HTML转换,然后保存这些跨度,链接以获得电话号码,等等,然后重新应用HTML跨度。

使用提供的示例:

代码语言:javascript
复制
    val content = "<a href=\"https://www.google.com\">Google</a> <h4>3. Email us (at&nbsp;<strong>test@gmail.com</strong>)</h4>"

    //convert to html
    val htmlSpannable = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
        Html.fromHtml(content, Html.FROM_HTML_MODE_LEGACY)
    } else {
        Html.fromHtml(content)
    }

    //save html spans
    val htmlUrlSpans = htmlSpannable.getSpans(0, htmlSpannable.length, URLSpan::class.java)

    //apply Linkify (resets existing Url spans)
    val linkifiedSpannable = SpannableString(htmlSpannable)
    Linkify.addLinks(linkifiedSpannable, Linkify.WEB_URLS or Linkify.EMAIL_ADDRESSES or Linkify.PHONE_NUMBERS)

    //reapply spans
    htmlUrlSpans.forEach { span ->
        val end: Int = linkifiedSpannable.getSpanEnd(span)
        val start: Int = linkifiedSpannable.getSpanStart(span)
        linkifiedSpannable.setSpan(span, start, end, 0)
    }

    //set combined one
    textView.text = linkifiedSpannable.trimEnd()
    textView.movementMethod = LinkMovementMethod.getInstance()

删除了example中的项目符号跨度,因为它是自定义的,所以需要重新读回它。

在这个场景中,如果您有一个像"<a href=\"https://www.google.com\">https://www.google.com</a>"这样的链接,那么进一步测试一下会发生什么可能会更好,这样就会再次应用span。

票数 1
EN

Stack Overflow用户

发布于 2021-03-01 11:14:43

这应该是可行的。

  1. In main.xml add a TextView text_html。

  1. 创建字符串html_string。

  1. In onCreate event:

a.将html_string的文本设置为html形式的文本,并在标签中声明链接(‘’ Google ‘’将在链接形式中显示'Google‘)。

因此,让我们将字符串html_string设置为:

代码语言:javascript
复制
<b>text_html_program: Explicit links using &lt;a&gt; markup.</b> This has markup for a <a href="http://www.google.com">link</a> specified via an &lt;a&gt; tag. Use a "tel:" URL to <a href="tel:4155551212">dial a phone number</a>

b.在TextView中显示此字符串。

代码语言:javascript
复制
text_html.setText( Html.fromHtml(html_string));
text_html.setMovementMethod(android.text.method.LinkMovementMethod.getInstance());
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66257894

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档