我正在创建自己的文本编辑器,并且我希望段落之间总是有额外的空格,所以我覆盖了EditText的OnKeyListener,这样当按下Enter键时,会在文本中插入两个换行符,当按下Backspace时光标位于段落的开头,删除两个字符而不是一个。
看起来很简单,但我的问题是,如果输入方法(即键盘)刚刚按下Enter键完成编辑一个单词然后按下Backspace,它将尝试通过用一个替换该单词来处理Backspace本身加下划线的自动更正版本(用自己覆盖单词)。但是,由于额外的换行符,光标已向前移动了两个字符,并且输入法不知道,所以当它覆盖时,它会被一个字符覆盖。
对不起,如果那令人困惑;这是一个bug的例子(光标所在的垂直条标记):
在空行上写下一个单词
test|
按Enter键以显示新行
test
|
按删除
ttest|
到目前为止,我已经尝试过修复错误的事情:
使用OnKeyListener正确处理退格。不幸的是,OnKeyListener只在输入方法完成之后获取键事件。
使用TextWatcher撤消输入法所做的操作。不幸的是,TextWatcher无法知道Backspace是否被按下,或者它看到的文本是否是其他内容的结果。
放弃按Enter键时自动添加额外换行符的整个想法。不幸的是,似乎没有任何其他方法可以在段落后添加额外的空格。据我所知,TextView的跨度只能为段落添加水平边距,而不是垂直边距。
所以我认为我最好的选择是在输入法获得它之前尝试捕获Backspace(顺便说一句,OnKeyPreIme也不起作用)。我宁愿不必完全编写自己的IME,而且我想让用户可以选择使用他们喜欢的任何IME进行打字,但如果我必须将自定义IME与文本编辑器捆绑在一起,那就这样吧。即便如此,关于自动更正如何工作以及实施的地方的文档很少,我甚至不知道从哪里开始。
非常感谢任何帮助;提前谢谢!
答案 0 :(得分:0)
使用restartInput不是正确的方法,因为它会重置IME状态并会出现性能问题。 您可以使用TextWatcher来监听文本更改并相应地更新编辑器中的文本。你可以看到如何做到here。
此外,如果您通过扩展EditText来创建编辑器,则可以覆盖方法
void handleTextChanged(CharSequence buffer, int start, int before, int after) {
并根据您的要求更新文本。