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

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

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

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

--- 

Затем они выбрали 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);

введите здесь описание изображения

Проблема

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


person Suragch    schedule 20.07.2017    source источник


Ответы (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);

чтобы избавиться от него. См. этот ответ для получения дополнительной информации.

person Suragch    schedule 20.07.2017