我可以覆盖Android输入法处理自动完成和自动更正的方式吗?

时间:2012-02-08 19:13:27

标签: android textview android-edittext ime android-input-method

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

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

对不起,如果那令人困惑;这是一个bug的例子(光标所在的垂直条标记):

  1. 在空行上写下一个单词

    test|
    
  2. 按Enter键以显示新行

    test
    
    |
    
  3. 按删除

    ttest|
    
  4. 到目前为止,我已经尝试过修复错误的事情:

    1. 使用OnKeyListener正确处理退格。不幸的是,OnKeyListener只在输入方法完成之后获取键事件。

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

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

    4. 所以我认为我最好的选择是在输入法获得它之前尝试捕获Backspace(顺便说一句,OnKeyPreIme也不起作用)。我宁愿不必完全编写自己的IME,而且我想让用户可以选择使用他们喜欢的任何IME进行打字,但如果我必须将自定义IME与文本编辑器捆绑在一起,那就这样吧。即便如此,关于自动更正如何工作以及实施的地方的文档很少,我甚至不知道从哪里开始。

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

1 个答案:

答案 0 :(得分:0)

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

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

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

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