How to set cursor position in EditText?

2019-01-07 04:54发布

There are two EditText,while loading the page a text is set in the first EditText, So now cursor will be in the starting place of EditText, I want to set cursor position in the second EditText which contains no data. How to do this?

20条回答
forever°为你锁心
2楼-- · 2019-01-07 05:11

I have done this way to set cursor position to end of the text after updating the text of EditText programmatically here, etmsg is EditText

etmsg.setText("Updated Text From another Activity");
int position = etmsg.length();
Editable etext = etmsg.getText();
Selection.setSelection(etext, position);
查看更多
Bombasti
3楼-- · 2019-01-07 05:11

Set cursor to a row and column

You can use the following code to get the position in your EditText that corresponds to a certain row and column. You can then use editText.setSelection(getIndexFromPos(row, column)) to set the cursor position. The following calls to the method can be made:

  • getIndexFromPos(x, y) Go to the column y of line x
  • getIndexFromPos(x, -1) Go to the last column of line x
  • getIndexFromPos(-1, y) Go to the column y of last line
  • getIndexFromPos(-1, -1) Go to the last column of the last line

All line and column bounds are handled; Entering a column greater than the line's length will return position at the last column of the line. Entering a line greater than the EditText's line count will go to the last line. It should be reliable enough as it was heavily tested.

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;
}

The question was already answered but I thought someone could want to do that instead.

It works by looping through each character, incrementing the line count every time it finds a line separator. When the line count equals the desired line, it returns the current index + the column, or the line end index if column is out of bounds. You can also reuse the getTrueLineCount() method, it returns a line count ignoring text wrapping, unlike TextView.getLineCount().

查看更多
唯我独甜
4楼-- · 2019-01-07 05:12

This code will help you to show your cursor at the last position of editing text.

 editText.requestFocus();
 editText.setSelection(editText.length());
查看更多
爷的心禁止访问
5楼-- · 2019-01-07 05:12

I won't get setSelection() method directly , so i done like below and work like charm

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);
查看更多
相关推荐>>
6楼-- · 2019-01-07 05:17

How to Set EditText Cursor position in Android

Below Code is Set cursor to Starting in EditText:

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

Below Code is Set cursor to end of the EditText:

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

Below Code is Set cursor after some 2th Character position :

 EditText editText = (EditText)findViewById(R.id.edittext_id);
 editText.setSelection(2);
查看更多
等我变得足够好
7楼-- · 2019-01-07 05:17

In kotlin, you could create an extension function like this:

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

and then simply call myEditText.placeCursorAtLast()

查看更多
登录 后发表回答