Как установить позицию курсора в EditText? - PullRequest
215 голосов
/ 07 ноября 2011

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

Ответы [ 20 ]

3 голосов
/ 12 октября 2017

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

 editText.requestFocus();
 editText.setSelection(editText.length());
2 голосов
/ 18 апреля 2016

Не забудьте позвонить requestFocus() до setSelection для редактирования текста.

1 голос
/ 20 июня 2016

Если вы хотите установить курсор после n символа справа налево, то вы должны сделать это следующим образом.

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

Если текст редактирования текста, например,

version<sub></sub>

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

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

    version<sub> </sub>
                ^
1 голос
/ 27 сентября 2018
EditText editText = findViewById(R.id.editText);
editText.setSelection(editText.getText().length());
1 голос
/ 13 апреля 2015

Я не получу метод 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);
0 голосов
/ 30 ноября 2018

Если вы хотите установить позицию курсора в EditText?попробуйте эти ниже код

EditText rename;
 String title = "title_goes_here";
 int counts = (int) title.length();
 rename.setSelection(counts);
 rename.setText(title);
0 голосов
/ 17 ноября 2018

В XML-файле android: paddingLeft:

<EditText
    android:id="@+id/txt_amount"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:paddingLeft="10dp"/>

Надеюсь, это поможет вам

0 голосов
/ 06 июня 2017

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

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

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

0 голосов
/ 11 марта 2013

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

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

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

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

0 голосов
/ 29 октября 2016

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

Вы можете использовать следующий код, чтобы получить позицию в вашем 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().

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...