如何使用 InputConnection 监听发送到 View 的软键事件?

How can you listen to soft key events sent to a View with an InputConnection?

我想在 Android 中创建一个自定义文本编辑器视图,带有可自定义的按键控件,这意味着我需要处理所有软件键盘按键事件。

为此,我可以扩展 View 并覆盖其 onKeyDown 事件。但是,我也想保留用户的完整软件键盘功能,例如建议和滑行输入,这似乎只有在我像这样正确覆盖 onCreateInputConnection 时才有效:

override fun onCreateInputConnection(outAttrs: EditorInfo): InputConnection {
    outAttrs.inputType = InputType.TYPE_CLASS_TEXT
    return object : BaseInputConnection(this, true) { ... }
}

不幸的是,InputConnection 似乎吃掉了所有关键事件并阻止调用 onKeyDown 等关键监听器方法,而我想监听关键事件并使用 InputConnection(以允许完整的软键盘功能)。

我发现的唯一解决方法是使用 TextWatcher 来监听文本更改事件,但我觉得这并不像我需要的那样灵活或简单;我需要完全直接访问所有按键。

我相信这是可能的,因为这正是 WebView 中的 input 元素的工作方式:我可以收听它的关键事件,用户可以输入带有建议的文本或滑行输入同时。事实上,我毕竟正在考虑使用 WebView,但我不明白为什么没有它就不可能做到这一点。

如何在 Android 的视图或可组合项中实现此行为?

使用软键盘时不存在按键事件。几乎每个软键盘都使用 InputConnection.commitText() 一次发送字符甚至单词。 KeyEvents 仅由硬件键盘、蓝牙键盘和音量等物理键真正生成。

如果您想查找对文本的更改,请执行 commitText() 函数并查看发送到那里的内容。您还需要重写一两个其他函数,例如 deleteSurroundingText,才能按下删除键。