3

我正在制作自己的文本编辑器,并且我希望段落之间总是有额外的空间,所以我覆盖了 EditText 的 OnKeyListener 以便在按下 Enter 时将两个换行符插入到文本中,并且当光标位于时按下 Backspace在段落的开头,两个字符被删除而不是一个。

看起来很简单,但我的问题是,如果输入法(即键盘)在按下 Enter 并按下 Backspace 时刚刚完成编辑一个单词,它将尝试通过用带下划线的自动替换该单词来处理 Backspace。自身的可纠正版本(用自身覆盖单词)。但是,由于额外的换行符,光标已经向前移动了两个字符,而输入法不知道这一点,所以当它覆盖时,它会关闭一个字符。

抱歉,如果这令人困惑;这是一个错误示例(垂直条标记光标所在的位置):

  1. 在空行上写一个字

    test|
    
  2. 点击回车,出现一个新行

    test
    
    |
    
  3. 按删除

    ttest|
    

到目前为止我为修复该错误所做的尝试:

  1. 使用 OnKeyListener 正确处理退格。不幸的是,OnKeyListener 只在输入法完成它的事情后才获得关键事件。

  2. 使用 TextWatcher 撤消输入法所做的操作。不幸的是,TextWatcher 无法知道是否按下了 Backspace,或者它看到的文本是否是其他内容的结果。

  3. 放弃按 Enter 时自动添加额外换行符的整个想法。不幸的是,似乎没有任何其他方法可以在段落之后添加额外的空格。据我所知,TextView 的跨度只能为段落添加水平边距,但不能为垂直边距添加。

所以我认为我最好的选择是在输入法得到它之前抓住退格键(顺便说一下,OnKeyPreIme 也不起作用)。我宁愿不必完全编写自己的 IME,并且我想让用户选择使用他们喜欢的任何 IME 进行输入,但如果我必须将自定义 IME 与文本编辑器捆绑在一起,那就这样吧。即便如此,关于自动更正如何工作以及在何处实现的文档很少,我什至不知道从哪里开始。

任何帮助将非常感激; 提前致谢!

4

1 回答 1

0

使用 restartInput 不是正确的方法,因为它会重置 IME 状态并且会出现性能问题。您可以使用 TextWatcher 收听文本更改并相应地更新编辑器中的文本。你可以在这里看到如何做。

此外,如果您通过扩展 EditText 创建编辑器,则可以覆盖该方法

void handleTextChanged(CharSequence buffer, int start, int before, int after) {

并根据您的要求更新文本。

于 2013-06-20T10:47:23.323 回答