Установка курсора в начале вставленного текста с помощью InputConnection.commitText
Документация для InputConnection.commitText(CharSequence text, int newCursorPosition)
Говорит, что newCursorPosition
средства:
int: Новая позиция курсора вокруг текста в символах Java. Если> 0, это относительно конца текста - 1; если <= 0, это относительно начала текста. Таким образом, значение 1 всегда будет перемещать курсор в позицию после вставки полного текста. Обратите внимание, что это означает, что вы не можете поместить курсор в текст, потому что редактор может вносить изменения в текст, который вы предоставляете, поэтому невозможно правильно указать места там.
В этом примере, если я введу два символа, поместите курсор между ними следующим образом
а затем введите другой символ, не имеет значения, если я установил newCursorPosition
в 0
или же 1
, Курсор всегда находится в конце вставки. Например, позвонив
inputConnection.commitText("aaa", 0);
или же
inputConnection.commitText("aaa", 1);
Оба показывают курсор так:
Если я сделаю -1
с
inputConnection.commitText("aaa", -1);
Я понял
1
а также -1
результаты ожидаются согласно документации. Почему не 0
поставить курсор в начало вставки? Я бы ожидал 0
должно быть так
inputConnection.commitText("aaa", 0);
но это не так. Почему бы и нет?
1 ответ
Это похоже на дефект в коде, но вы должны быть судьей.
Взгляните на replaceText() в BaseInputConnection
, Я считаю, что это код, который помещает курсор после вставки. (replaceText()
вызывается из commitText())
,
В указанном коде a
это начало выбора. b
это конец выбора. Поскольку в примере нет выбора, а курсор находится на индексе 1, то a == b == 1
, Кроме того, новый текст (aaa) не вставляется (заменяя выделение [a,b]) до тех пор, пока курсор не будет перемещен к новому выделению.
Selection.setSelection(content, newCursorPosition)
устанавливает позицию курсора, поэтому для 0 и 1, чтобы произвести идентичное позиционирование в вашем примере, я ожидаю, что производное значение newCursorPosition
быть одинаковым для обоих входов.
Поместив курсор между двумя восьмёрками в позицию 1, давайте подумаем над следующим кодом:
if (newCursorPosition > 0) {
newCursorPosition += b - 1;
} else {
newCursorPosition += a;
}
Для вашего ввода 1, newCursorPosition
> 0, поэтому newCursorPosition = newCursorPosition + 1 - 1 или 1.
Для вашего ввода 0, newCursorPosition
не = 0, поэтому newCursorPosition = newCursorPosition + a (0 + 1) или 1.
Поскольку оба входа дают одно и то же значение, я ожидаю Selection.setSelection(content, newCursorPosition)
чтобы получить результаты, которые вы видите.
Я не следовал коду именно в этом месте, но я считаю, что это проблема. Я следовал пути выполнения в BaseInputConnection
за newCursorPosition = 0
а также newCursorPosition = 1
на эмуляторе Pixel с API 21 и вышеизложенным.