Получить курсор положения клавиатуры Android - PullRequest
5 голосов
/ 13 марта 2012

Я работаю над программной клавиатурой Android и мне было интересно, есть ли способ, чтобы клавиатура могла получить текущую позицию курсора?В настоящее время я использую следующий код:

connection.getTextBeforeCursor(Integer.MAX_VALUE, 0).length()

Однако это очень медленно (даже для небольшого объема текста это может занять до 50 мс - при работе на Galaxy Nexus, так что это, вероятно,быть еще медленнее для телефонов нижнего уровня).Я также проверил его на Droid Incredible, и задержка еще более серьезная.

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

Поскольку вы можете установить позицию курсора и получить выделенный текст (но не позицию выделенного текста)разве не должна быть функция для определения положения курсора?

Спасибо за помощь!

Ответы [ 2 ]

7 голосов
/ 14 августа 2013

Это старый вопрос, но я недавно столкнулся с той же проблемой.Чтобы получить позицию курсора:

InputConnection ic = getCurrentInputConnection();
ExtractedText et = ic.getExtractedText(new ExtractedTextRequest(), 0);
int selectionStart = et.selectionStart;
int selectionEnd = et.selectionEnd;
1 голос
/ 17 июля 2018

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

 connection.getTextBeforeCursor(Integer.MAX_VALUE, 0).length()

Это, вероятно, связано с тем, что реализация Android метода getTextBeforeCursor(int, int), по-видимому, пытается создать экземпляр массива CharSequence.длиной n до поиска запрошенных символов.В этом случае он пытается создать экземпляр массива длиной Integer.MAX_VALUE.Фактический возвращенный массив обрезается до соответствующего размера.

Я использовал аналогичный метод для получения позиции курсора из InputConnection, но ограничил значение n домаксимальное значение, которое я контролирую.Итак, если я установлю максимальное количество символов для EditText до 25 символов, тогда это будет мое значение n .И это довольно быстро.Вот пример моего подхода:

int cursorPosition = mInputConnection.getTextBeforeCursor(MAX_CHARACTERS, 0).length();
...