WebView 是用来展示网页内容的控件,我们也常常会对网页的文本进行选中复制分享等等的操作。

WebView 选中文本

那么在开发中,我们如何获取用户选中的文本呢?

实际上,WebView 并没有给我们提供相应的 API,所以我们不得不另辟蹊径。

换个思路,既然 Android 端无法直接获取到选中的内容,那就从 Web 端获取。这时候可能会有一个问题,WebView 加载的网页未必都是我们自己或者团队内部开发的,所以不一定能让第三方的网站也为我们适配这种功能,不过不用担心,假如我们通过客户端注入 JS 的方式,这个问题也就迎刃而解了。

首先是 JS 函数:

object JsFunction {
    fun getSelection() = """
        javascript:(function getSelectedText() {
            var txt;
            if (window.getSelection) {
                txt = window.getSelection().toString();
            } else if (window.document.getSelection) {
                txt = window.document.getSelection().toString();
            } else if (window.document.selection) {
                txt = window.document.selection.createRange().text;
            }
            return txt;
        })()
    """.trimIndent()
}

因为 Java 的字符串拼接方式不太直观,所以我这里用 Kotlin 来写,这个 JS 函数相信也足够简单易懂,通过获取选区,然后再获取选区内的文字并返回。

然后就是利用之前『Android WebView 和 JavaScript 交互』讲过的方法执行:

class MyWebView(context: Context, attrs: AttributeSet? = null) : WebView(context, attrs) {
    ...
    private fun getSelection() {
        evaluateJavascript(JsFunction.getSelection()) { selectedText ->
            // do what you want
        }
    }
}

接下来就可以拿到选中的文字执行自己的逻辑了。