有两个EditText,在加载页面时,在第一个EditText中设置了一个文本,所以现在光标将位于EditText的起始位置,我想在第二个EditText中设置光标的位置,其中不包含数据。如何做到这一点?


当前回答

这将把光标移动到edittext的末尾

.toString myEditText.setSelection (myEditText.getText () () . length ())

其他回答

如果我们直接使用editText.setSelection(position),有时编辑文本光标不会出现在特定位置;. 那样的话,你可以试试

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

将游标设置为行和列

您可以使用下面的代码获取EditText中与某一行和列对应的位置。然后可以使用editText。setSelection(getIndexFromPos(row, column))设置游标位置。 可以对该方法进行以下调用:

getIndexFromPos(x, y)到x行的y列 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()。

如何解决在US Mobile中格式化后自动移动到最后一个位置的光标位置问题,如Android中的(xxx) xxx-xxxx。

private String oldText = "";
private int lastCursor;
private EditText mEtPhone;

@Override
    public void afterTextChanged(Editable s) {
String cleanString = AppUtil.cleanPhone(s.toString());

String format = cleanString.length() < 11 ? cleanString.replaceFirst("(\\d{3})(\\d{3})(\\d+)", "($1) $2-$3") :
                cleanString.substring(0, 10).replaceFirst("(\\d{3})(\\d{3})(\\d+)", "($1) $2-$3");


boolean isDeleted = format.length() < oldText.length();

        try {

            int cur = AppUtil.getPointer(lastCursor, isDeleted ? s.toString() : format, oldText, isDeleted);
            mEtPhone.setSelection(cur > 0 ? cur : format.length());

        }catch (Exception e){
            e.printStackTrace();
            mEtPhone.setSelection(format.length());
        }

        mEtPhone.addTextChangedListener(this);

    }

    @Override
    public void beforeTextChanged(CharSequence s, int start, int count, int after) {

        oldText = s.toString();
        lastCursor = start;
    }

在我的例子中,将下面的方法定义为任何Activityclass,活动名称为AppUtil并全局访问它

public static int getPointer(int index, String newString, String oldText, boolean isDeleted){

        int diff = Math.abs(newString.length() - oldText.length());

        return diff > 1 ? isDeleted ? index - diff : index  + diff : isDeleted ? index : index + 1;
    }

public static String cleanPhone(String phone){

        if(TextUtils.isEmpty(phone))
            return "";

        StringBuilder sb = new StringBuilder();
        for(char c : phone.toCharArray()){
            if(Character.isDigit(c))
                sb.append(c);
        }
        return sb.toString();
    }

如果你想设置一个特定的位置

edittext.setSelection(position);

Edittext中的setSelection(int index)方法应该允许您这样做。

这段代码将帮助您将光标显示在编辑文本的最后一个位置。

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