Могу ли я переопределить способ, которым Android Input Method обрабатывает автозаполнение и автозамену? - PullRequest
3 голосов
/ 08 февраля 2012

Я создаю свой собственный текстовый редактор, и я хочу, чтобы между абзацами всегда было дополнительное пространство между ними, поэтому я переопределил OnKeyListener EditText, чтобы при нажатии клавиши ввода две строки вставлялись в текст, а когда при нажатии клавиши Backspaceкурсор находится в начале абзаца, вместо одного удаляются два символа.

Кажется достаточно простым, но моя проблема в том, что если метод ввода (т. е. клавиатура) только что закончил редактирование слова при нажатии клавиши Enterи затем нажимается Backspace, он пытается обработать сам Backspace, заменяя это слово подчеркнутой автокорректируемой версией самого себя (перезаписывая слово самой собой).Тем не менее, курсор был перемещен вперед на два символа из-за дополнительной новой строки, и метод ввода не знает об этом, поэтому, когда он выполняет перезапись, он отключается на один символ.

Извините, если это сбивает с толку;Вот пример ошибки (вертикальная черта обозначает, где находится курсор):

  1. Напишите слово в пустой строке

    test|
    
  2. Нажмите Enter, чтобы появилась новая строка

    test
    
    |
    
  3. Нажмите delete

    ttest|
    

Вещи, которые я пытался исправить до сих пор:

  1. Использование OnKeyListener для правильной обработки возврата.К сожалению, OnKeyListener получает ключевое событие только после того, как метод ввода сделал свое дело.

  2. Использование TextWatcher для отмены того, что сделал метод ввода.К сожалению, TextWatcher не может узнать, была ли нажата клавиша Backspace или текст, который он видит, является результатом чего-то другого.

  3. Отбросил саму идею автоматического добавления дополнительных символов новой строки всякий раз, когда Enterнажат.К сожалению, кажется, нет другого способа добавить лишние пробелы после абзаца.Насколько я знаю, промежутки TextView могут добавлять только горизонтальные поля к абзацу, но не вертикальные.

Так что мне остается думать, что моя лучшая ставка - пойматьВозврат до того, как метод ввода получит его (кстати, OnKeyPreIme тоже не работает).Я бы предпочел не писать свой собственный IME полностью, и я бы хотел дать пользователям возможность печатать с любым IME, который они предпочитают, но если мне придется связать пользовательский IME с текстовым редактором, пусть будет так.Несмотря на это, документации о том, как работает автозамена и где она реализована, так мало, что я даже не знаю, с чего начать.

Любая помощь будет принята с благодарностью;заранее спасибо!

1 Ответ

0 голосов
/ 20 июня 2013

Использование restartInput - неправильный способ сделать это, так как это сбросит состояние IME и приведет к проблемам с производительностью. Вы можете использовать TextWatcher для прослушивания текстовых изменений и соответственно обновлять текст в редакторе. Вы можете увидеть, как это сделать здесь .

Кроме того, если вы создаете свой редактор путем расширения EditText, вы можете переопределить метод

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

и обновляет текст в соответствии с вашими требованиями.

...