Как установить позицию курсора в EditText?

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

17 ответов


где позиция является int:

editText1.setSelection(position)

Я сделал это, чтобы установить позицию курсора в конец текста после обновления текста EditText программно вот,etmsg is EditText

etmsg.setText("Updated Text From another Activity");
int position = etmsg.length();
Editable etext = etmsg.getText();
Selection.setSelection(etext, position);

Как установить позицию курсора EditText в Android

код установите курсор на пуск на EditText:

 EditText editText = (EditText)findViewById(R.id.edittext_id);
 editText.setSelection(0);

код установить курсор в конец на EditText:

EditText editText = (EditText)findViewById(R.id.edittext_id);
editText.setSelection(editText.getText().length());

ниже кода установлен курсор после некоторой позиции 2-го символа:

 EditText editText = (EditText)findViewById(R.id.edittext_id);
 editText.setSelection(2);

Я хочу установить позицию курсора в edittext, который не содержит данных

в пустом EditText есть только одна позиция, это setSeletion(0).

или вы имели в виду, что хотите сосредоточиться на своем EditText когда открывается ваша деятельность? В таком случае его requestFocus()


используйте нижеприведенную строку

e2.setSelection(e2.length());

e2 это изменить имя текстового объекта


пусть editText2 - ваше второе представление EditText .затем поместите следующий фрагмент кода в onResume()

editText2.setFocusableInTouchMode(true);
editText2.requestFocus();

или поставить

<requestFocus />

в вашем xml-макете второго представления EditText.


некоторое время редактировать текстовый курсор donot приходит в определенное положение, если мы напрямую используем editText.setSelection(position); . В этом случае вы можете попробовать

editText.post(new Runnable() {
                @Override
                public void run() {
                    editText.setSelection(string.length());
                }
            });

setSelection(int index) метод Edittext должно позволить вам это сделать.


в качестве напоминания: если вы используете edittext.setSelection() установить курсор, и он не работает при настройке alertdialog например, обязательно установите selection() после создания диалогового окна

пример:

AlertDialog dialog = builder.show();
input.setSelection(x,y);

помните вызов requestFocus() до setSelection для edittext.


этот код поможет вам показать курсор в последней позиции редактирования текста.

 editText.requestFocus();
 editText.setSelection(editText.length());

Я не получу метод setSelection() напрямую , поэтому я сделал, как показано ниже, и работать как шарм

EditText editText = (EditText)findViewById(R.id.edittext_id);
editText.setText("Updated New Text");
int position = editText.getText().length();
Editable editObj= editText.getText();
Selection.setSelection(editObj, position);

если вы хотите установить курсор после n персонаж из справа налево, тогда ты должен сделать вот так.

edittext.setSelection(edittext.length()-n);

если текст edittext, как

version<sub></sub>

и вы хотите переместить курсор на 6-ю позицию справа

затем он переместит курсор на-

    version<sub> </sub>
                ^

установите курсор на строку и столбец

вы можете использовать следующий код, чтобы получить позицию в вашем EditText, которая соответствует определенной строке и столбцу. Затем вы можете использовать editText.setSelection(getIndexFromPos(row, column)) для установки положения курсора. Можно выполнить следующие вызовы метода:

  • getIndexFromPos(x, y) перейдите в столбец y строки x
  • getIndexFromPos(x, -1) перейти к последнему столбцу строки x
  • getIndexFromPos(-1, y) перейти к столбцу y последней строки
  • getIndexFromPos(-1, -1) перейти к последний столбец последней строки

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

static final String LINE_SEPARATOR = System.getProperty("line.separator");

int getIndexFromPos(int line, int column) {
    int lineCount = getTrueLineCount();
    if (line < 0) line = getLayout().getLineForOffset(getSelectionStart());  // No line, take current line
    if (line >= lineCount) line = lineCount - 1;  // Line out of bounds, take last line

    String content = getText().toString() + LINE_SEPARATOR;
    int currentLine = 0;
    for (int i = 0; i < content.length(); i++) {
        if (currentLine == line) {
            int lineLength = content.substring(i, content.length()).indexOf(LINE_SEPARATOR);
            if (column < 0 || column > lineLength) return i + lineLength;  // No column or column out of bounds, take last column
            else return i + column;
        }
        if (String.valueOf(content.charAt(i)).equals(LINE_SEPARATOR)) currentLine++;
    }
    return -1;  // Should not happen
}

// Fast alternative to StringUtils.countMatches(getText().toString(), LINE_SEPARATOR) + 1
public int getTrueLineCount() {
    int count;
    String text = getText().toString();
    StringReader sr = new StringReader(text);
    LineNumberReader lnr = new LineNumberReader(sr);
    try {
        lnr.skip(Long.MAX_VALUE);
        count = lnr.getLineNumber() + 1;
    } catch (IOException e) {
        count = 0;  // Should not happen
    }
    sr.close();
    return count;
}

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

оно работает путем закреплять петлей через каждый символ, увеличивая количество строк каждый раз, когда он находит разделитель строк. Если число строк равно требуемой строке, возвращается текущий индекс + столбец или индекс конца строки, если столбец находится за пределами. Вы также можете использовать getTrueLineCount() метод, он возвращает количество строк, игнорируя перенос текста, в отличие от TextView.getLineCount().


EditText editText = findViewById(R.id.editText);
editText.setSelection(editText.getText().length());

в kotlin вы можете создать такую функцию расширения:

fun EditText.placeCursorAtLast() {
    val string = this.text.toString()
    this.setSelection(string.length)
}

а затем просто позвоните myEditText.placeCursorAtLast()


Я считаю, что самый простой способ сделать это-просто использовать отступы.

скажите в разделе edittext вашего xml, добавьте android: paddingLeft= " 100dp" Это переместит вашу начальную позицию курсора 100dp справа от левого конца.

таким же образом, вы можете использовать android: paddingRight= " 100dp" Это переместит вашу конечную позицию курсора 100dp влево от правого конца.

для более подробной информации, проверить эту статью мой блог: Android: Установка Запуска Курсора и конечная позиция в виджете EditText