我想在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 中实现此行为,无论是在视图还是可组合对象中?
使用软键盘时,KeyEvents 不存在。 几乎每个软键盘都使用 InputConnection.commitText() 一次发送字符甚至单词。 KeyEvents 仅由硬件键盘、蓝牙键盘和音量等物理键真正生成。
如果你想寻找对文本的更改,实现 commitText() 函数并查看发送到那里的内容。 还有一两个其他函数,如deleteSurroundingText,你也需要覆盖才能获得删除。