Установить написание текста на EditText с пользовательской клавиатуры в Android

Объяснение того, что я пытаюсь сделать

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

Допустим, пользователь начинает вводить слово (где - представлять буквы):

--- 

Затем они выбрали a из всплывающего окна (я использую только a представлять концепцию выбора особой монгольской формы глифа). Unicode для этого письма будет отображаться следующим образом, если они продолжат печатать:

---a--

Тем не менее, Unicode отображается как

---A

в конце слов. (a а также A имеют одинаковый код в Unicode.) Таким образом, пользователь не понимает, почему он выбрал a из всплывающего ключа, но он отображается как A в редакторе. Если они просто продолжат печатать, то все будет в порядке, так как он отображается как a в середине слов.

То, что я хочу сделать, это установить какой-то временный промежуток на a из ---a так что это не будет отображаться как ---A прежде чем они введут следующую букву. Но если добавить пробел или переместить курсор в другое место, он вернется к значению по умолчанию ---A Форма для заключительных писем. (То есть временный промежуток будет отменен.)

Реальный пример

Если реферат a а также A слишком запутанно, вот реальный пример. Пользователь хочет ввести монгольский UE форма (Юникод \u1826\u180c) в этом слове

Но с тех пор \u1826\u180c переводится так в конце слов

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

которые могут быть временно предоставлены с \u1826\u180c\u200d,

Документация

В документации сказано

Если ваш IME выполняет прогнозирование текста или требует нескольких шагов для создания глифа или слова, вы можете отображать ход выполнения в текстовом поле до тех пор, пока пользователь не введет слово, а затем вы можете заменить частичную композицию законченным текстом.

И это дает этот пример и изображение:

InputConnection ic = getCurrentInputConnection();
ic.setComposingText("Composi", 1);
ic.setComposingText("Composin", 1);
ic.commitText("Composing ", 1);

проблема

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

1 ответ

Решение

Следующий код устанавливает временный диапазон составления, когда всплывающее окно возвращает искомую строку

if (selectedItem.equals("a")) {
    inputConnection.setComposingText("a", 1);
}

где selectedItem это строка, выбранная пользователем из ключевых кандидатов во всплывающем окне.

Обратите внимание, что a имеет подчеркивание, указывающее, что это составной диапазон. (Это надуманный пример из вопроса, где a будет представлен как A если текст был зафиксирован немедленно.)

Это также работает для реального примера в вопросе

if (selectedItem.equals("\u1826\u180c")) {
    inputConnection.setComposingText("\u1826\u180c\u200d", 1);
}

Фиксация диапазона сочинения

Когда подтверждается, что пользователь хочет сохранить диапазон составления (т. Е. Он продолжает набирать больше букв в слове), его можно зафиксировать с помощью

inputConnection.commitText("\u1826\u180c", 1);

Отказ от сочинения

Если пользователь щелкает где-то еще, диапазон создания не отменяется. Но это другой вопрос.

Ваша клавиатура может переопределить onUpdateSelection прослушивать изменения курсора там. Тогда позвони

inputConnection.finishComposingText();

сохранить любой текст, который был в области создания. Или же

ic.commitText("", 1);

чтобы избавиться от этого. Смотрите этот ответ для более.

Другие вопросы по тегам