Установка курсора в начале вставленного текста с помощью InputConnection.commitText

Документация для InputConnection.commitText(CharSequence text, int newCursorPosition)< /a> говорит, что newCursorPosition означает:

int: новая позиция курсора вокруг текста в символах Java. Если > 0, это относительно конца текста - 1; если ‹= 0, это относительно начала текста. Таким образом, значение 1 всегда будет перемещать курсор на позицию после вставки полного текста. Обратите внимание, что это означает, что вы не можете поместить курсор в текст, потому что редактор может вносить изменения в текст, который вы предоставляете, поэтому невозможно правильно указать его местоположение.

В этом примере, если я ввожу два символа, то помещаю курсор между ними следующим образом

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

а затем введите другой символ, не имеет значения, устанавливаю ли я newCursorPosition на 0 или 1. Курсор всегда находится в конце вставки. Например, вызов

inputConnection.commitText("aaa", 0);

or

inputConnection.commitText("aaa", 1);

Оба показывают курсор следующим образом:

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

Если я сделаю -1 с

inputConnection.commitText("aaa", -1);

я понимаю это

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

Результаты 1 и -1 ожидаются в соответствии с документацией. Почему 0 не помещает курсор в начало вставки? Я ожидаю, что 0 должно быть таким

inputConnection.commitText("aaa", 0);

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

но это не так. Почему бы и нет?


person Suragch    schedule 18.07.2017    source источник
comment
Почему вы показываете два разных местоположения для 0? Может 0 не влияет?   -  person Alexander Higgins    schedule 19.07.2017
comment
На последнем изображении я показываю ожидаемый результат, а не фактический результат. @АлександрХиггинс   -  person Suragch    schedule 19.07.2017


Ответы (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 и тому, что описано выше держится.

person Cheticamp    schedule 19.09.2017
comment
Перечитывая документацию, я могу понять смысл того, что теперь вы не можете позиционировать курсор в тексте. Если бы выбор 0 вместо newCursorPosition мог переместить курсор в начало вставки, то это фактически дало бы вам некоторую возможность позиционирования. Как вы сказали, это все еще кажется дефектом, но, возможно, его можно понять. - person Suragch; 20.09.2017
comment
@Suragch Возможно, документация должна гласить: Если ›= 0, это относительно конца текста - 1; если ‹ 0, это относительно начала текста. Тем не менее, я думаю, что курсор можно поместить в начало вставки, но это не должно быть чем-то очень востребованным (я включил ваше поясняющее объяснение a и b.) - person Cheticamp; 20.09.2017