2012-02-08 14 views
3

我正在做我自己的文本编辑器,并且我希望段落之间始终有额外的空间,所以我重写了EditText的OnKeyListener,以便在按下Enter时将两个换行符插入文本中,并且当按下Backspace时光标位于段落的开头,两个字符将被删除而不是一个。我可以重写Android输入法处理自动完成和自动更正的方式吗?

似乎很简单,但我的问题是,如果输入法(即键盘)刚按下Enter键然后按下Backspace时完成了一个单词的编辑,它将尝试处理Backspace本身,方法是将该单词替换为自身带下划线的自动修正版本(自行覆盖单词)。但是,由于额外的换行符,游标已经向前移动了两个字符,并且输入法不知道,所以当它将其覆盖掉一个字符时。

对不起,如果这是令人困惑;这里的错误(竖线标记光标所在)的例子:

  1. 写在一个空行字

    test| 
    
  2. 命中进入这样一个新的行出现

    test 
    
    | 
    
  3. 按下删除

    ttest| 
    

事情我到目前为止已经试过修复bug:

  1. 使用OnKeyListener妥善处理退格。不幸的是,OnKeyListener仅在输入方法完成后才获取关键事件。

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

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

所以我离开了我最好的选择是试图赶上Backspace键输入法得到它之前的思维(OnKeyPreIme没有任何工作,顺便说一句)。我宁愿不必完全编写自己的IME,我想让用户可以选择他们喜欢的任何IME进行打字,但是如果我必须将自定义IME与文本编辑器捆绑在一起,那就这样做吧。即便如此,关于自动更正的工作方式以及实现方式的文档还很少,我甚至不知道从哪里开始。

任何帮助将不胜感激;提前致谢!

+1

自己修复了这个问题。我所要做的就是将下面的代码插入到我的EditText中(在添加换行符后处理Enter按钮的函数中): 'InputMethodManager imm =(InputMethodManager)getContext()。getSystemService(Context.INPUT_METHOD_SERVICE); ' 'imm.restartInput(this);' – Andy 2012-02-09 20:17:00

回答

0

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

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

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

和更新文本按您的要求。