安卓EditText监听最近的词语

129 阅读1分钟

安卓EditText监听最近的词语

最近在搞一个带代码提示的代码编辑,其中获取临近词语来进行下一步就有必要了

代码

//正则匹配表达,当遇到以下中括号里的内容会停止继续获取,由此得到当前已输入的词
private val exceptRegex = "[ \\n;,.)/(\'\"]".toRegex()
fun initOnWord(editText: EditText, onWord: (String)->Unit) {
    editText.doOnTextChanged { text, start, before, count ->
        //字符串为null不继续
        if (text == null) return@doOnTextChanged
        //输入文字继续
        val aboveWord = StringBuffer("")
        var abovePos = editText.selectionStart - 1
        while (true) {
            if (abovePos < 0) break
            val c = text[abovePos--]
            if (exceptRegex.matches(c.toString())) {
                break
            }
            aboveWord.insert(0, c)
        }
        //aboveWord就是得到的输入的最近的词
        onWord(aboveWord.toString())
    }
}

使用

initOnWord(edt) {
    L.i("得到词语", it)
}

运行结果

run

补充

//光标所在的当前行
val curLine = edt.layout?.getLineForOffset(s) ?: return@doOnTextChanged
//该行位置坐标信息
val lineBounds = Rect()
edt.getLineBounds(curLine, lineBounds)
//当前行的内容
val curLineContent = text.split('\n')[curLine]