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
}
}
}
接下来就可以拿到选中的文字执行自己的逻辑了。