Установка курсора в начале вставленного текста с помощью 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 и вышеизложенным.

Другие вопросы по тегам