Установить написание текста на 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);
чтобы избавиться от этого. Смотрите этот ответ для более.