Объяснение того, что я пытаюсь сделать
Я делаю пользовательскую клавиатуру в приложении, которая работает по тому же принципу, что и в этом примере. Однако на моей клавиатуре я использую всплывающие окна для отображения дополнительных форм букв. В традиционном монгольском буквы имеют разную форму в зависимости от того, расположены ли они в начале, середина или конец слова. Обычно их можно определить из контекста, но иногда пользователю необходимо явно выбрать альтернативную форму из кандидатов всплывающих клавиш.
Допустим, пользователь начинает вводить слово (где -
представляют собой буквы):
---
Затем они выбрали a
из всплывающего окна (я использую a
только для представления концепции выбора специальной формы монгольского глифа). Юникод для этой буквы будет отображаться следующим образом, если они продолжат печатать:
---a--
Однако Unicode отображается как
---A
в конце слов. (a
и A
имеют один и тот же код в Unicode.) Таким образом, пользователь сбит с толку, почему он выбрал a
из всплывающего ключа, но в редакторе он отображается как A
. Однако, если бы они просто продолжали печатать, все было бы в порядке, так как это будет отображаться как a
в середине слов.
Что я хочу сделать, так это установить какой-то временный интервал для a
из ---a
, чтобы он не отображался как ---A
до того, как они наберут следующую букву. Но если они добавят пробел или переместят курсор в другое место, он вернется к форме по умолчанию ---A
для последних букв. (То есть временный интервал будет отменен.)
Реальный пример
Если абстрактные a
и A
слишком запутаны, вот реальный пример. Пользователь хочет ввести в этом слове монгольскую форму UE
(Unicode \u1826\u180c
).
Но так как \u1826\u180c
отображается вот так в конце слов
пользователь сбит с толку, пока не продолжит печатать. Я хочу, чтобы диапазон выглядел так
который можно временно визуализировать с помощью \u1826\u180c\u200d
.
Документация
В документации говорится
Если ваш IME выполняет прогнозирование текста или требует нескольких шагов для составления глифа или слова, вы можете отображать ход выполнения в текстовом поле, пока пользователь не подтвердит слово, а затем вы можете заменить частичную композицию законченным текстом.
И это дает этот пример и изображение:
InputConnection ic = getCurrentInputConnection();
ic.setComposingText("Composi", 1);
ic.setComposingText("Composin", 1);
ic.commitText("Composing ", 1);
Проблема
Я собирался описать, почему это не работает в этом разделе, но в процессе настройки моего вопроса здесь я обнаружил, что это действительно работает. Поэтому я добавлю свой ответ ниже в качестве примера для других людей, которые делают что-то подобное.