如何监听 android 编辑文本中的回车键?

How to listen for enter key in android edit text?

如何在 android 中监听回车键(通过模拟设备键盘,而不是计算机键盘)?我尝试了很多解决方案,包括将 onEditorActionListener 与各种不同的 IME 操作一起使用,将 onKeyListener 用于 Action.DOWN 或 KeyEvent.KEYCODE_ENTER - 以及两者的数十种变体。

将编辑文本设置为单行可行,但我希望编辑文本为多行,并且在按下回车键时仍然创建一个新行。其他几个答案在不同程度上起作用,但 none 提供了我想要的:一个 android 模拟器键盘输入键,它可以正常工作(创建新行),但也可以用来触发我自己的方法。

我知道这个问题已经被问过很多次了,但是 none 的答案在我的代码中有效。

这是我当前的基本代码。

characterNotesEditText.setOnEditorActionListener { _, actionId, event ->
        Log.i("FragmentActivity", "It works")
        return@setOnEditorActionListener true
    }

如果在笔记本电脑上按下回车键,它会触发日志,但如果之前按下回车键,只会在模拟器键盘上触发。这一次有效,然后在模拟器键盘上按 enter 没有任何反应。

最后我放弃了使用 key listener 或 ime action listener,根据 CommonsWare 的建议,我使用了 textwatcher 来跟踪新行。

以下代码是我的最终解决方案,用例是在创建新行时查找并自动缩进它。 'toDelete' 布尔值用于确保可以通过缩进退格。

 override fun beforeTextChanged(text: CharSequence?, p1: Int, p2: Int, p3: Int) {
    val string: String = text.toString()
    toDelete = string.length > 1 && string[string.length - 2] == '\n'
}

override fun onTextChanged(
    txt: CharSequence,
    start: Int,
    before: Int,
    count: Int
) {
    if (!toDelete) {
        val string: String = txt.toString()
        if (string.isNotEmpty() && string[string.length - 1] == '\n') {
            if (editText.selectionStart == txt.length || editText.selectionEnd == txt.length) {
                editText.text.append("    ")
            }
        }
    }
}