java - HTML 到文本,带有自定义链接点击监听器

标签 java android kotlin

这是示例 HTML 字符串,

<span class=\"proflinkWrapper\"><span class=\"proflinkPrefix\">+<\/span><a class=\"proflink\" href=\"https://plus.google.com/114461178896543099856\" oid=\"114461178896543099856\">Elon Musk<\/a><\/span> hey

使用 HTML.fromHtml,我明白了,

+Elon Musk hey

点击 +Elon Musk 后,我会进入浏览器,但我想要相应的 URL 并在我的应用程序中使用它,请向我提出建议! (我不需要 spannable,因为内容非常动态并且采用 HTML 格式)

是否可以拦截 Html.fromHtml 并获取 URL 并使其不在浏览器中打开,然后按照我的意愿在我的应用程序中使用它?

最佳答案

我通过修改 LinkMovementMethod 找到了解决方法

import android.text.Spannable
import android.text.style.URLSpan
import android.view.MotionEvent
import android.widget.TextView

class MyLinkMovementMethod(var onUrlClickListener: (String) -> Unit) : android.text.method.LinkMovementMethod() {

    override fun onTouchEvent(widget: TextView, buffer: Spannable, event: MotionEvent): Boolean {
        val action = event.action

        if (action == MotionEvent.ACTION_UP) {
            var x = event.x.toInt()
            var y = event.y.toInt()
            x -= widget.totalPaddingLeft
            y -= widget.totalPaddingTop
            x += widget.scrollX
            y += widget.scrollY

            val layout = widget.layout
            val line = layout.getLineForVertical(y)
            val off = layout.getOffsetForHorizontal(line, x.toFloat())

            val link = buffer.getSpans(off, off, URLSpan::class.java)
            if (link.isNotEmpty()) {
                val url = link[0].url
                if (url.contains("https") or url.contains("tel") or url.contains("mailto") or url.contains("http") or url.contains("https") or url.contains("www")) {
                    onUrlClickListener(url)
                }
                return true
            }
        }
        return super.onTouchEvent(widget, buffer, event)
    }
}

你可以通过修改代码来添加自己的监听器,目前我已经添加了URL点击的监听器。您可以通过添加以下行在代码中使用它:

textview.movementMethod = MyLinkMovementMethod(fun(url: String) {
                        Log.e("URL", url)
                    })

代码采用 Kotlin 语言。

关于java - HTML 到文本,带有自定义链接点击监听器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52201205/

相关文章:

java - 复制文件导致输出中出现 java.io.FileNotFoundException(拒绝访问)

Java Integer auto自动装箱

android - 取消发布应用程序可以使我的帐户遵守政策吗

java - 如何使用 Kotlin 构建 cordova 项目

android - 注入(inject)改造android kotlin

java - 如何在一个PrepareStatement (sqlite) 中使用Array 或List<>

java - Scanner.nextLine 输入跳过

android - OSMdroid - 错误 : no suitable constructor found for Overlay(no arguments) constructor Overlay. 覆盖(上下文)不适用

java - 获取授权码后使用 Google Android Auth 2.0 HTTP post 请求进行注册

swift - KMM iOS 崩溃,因为 `Flow` 没有正确抛出,异常与 @Throws 指定的类不匹配