如何在EditText中设置光标位置?


235

有两个EditText,在加载页面时在第一个EditText中设置了文本,因此现在光标将位于的开始位置EditText,我想在第二个不包含数据的EditText中设置光标位置。这该怎么做?


2
您可以将其重力设置为'center'。它将自动将光标设置为居中。您的文字也将居中。
Hiral Vadodaria

首先,尝试提高您的接受率。其次,当edittext中没有文本时,通过设置光标位置是什么意思?
弗拉基米尔

Answers:



96

在这里以编程方式更新EditText的文本后,我已经通过这种方式将光标位置设置为文本的结尾etmsg即EditText

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

4
+1啊!很好,它帮助我在edittext中设置了光标位置。
Dharmendra

2
这对我不起作用。我的EditText中有Spannable字符串。有没有解决方法?
toobsco42

1
@ toobsco42你好,我刚才想用Spannable字符串中的EditText ..检查这个pastebin.com/i02ZrNw4,它是按预期工作,因为它应该是。检查和比较
MKJParekh

可以通过xml File实现吗?@MKJParekh
Yog

1
似乎也做同样的事情:etmsg.setText("my new text..."); etmsg.setSelection(etmsg.length());
史蒂夫·布莱克威尔

37

如何在Android中设置EditText光标位置

下面的代码将光标设置为开始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);

17

我想在不包含数据的edittext中设置光标位置

空的EditText中只有一个位置,即setSelection(0)

还是您是说您想EditText在活动开始时专注于自己?在这种情况下 requestFocus()


setSelection(0)不起作用,我不想将焦点移至第二个EditText,我只想将光标设置在第二个EditText中
nila

3
如果我没记错的话,当EditText请求焦点时,便会设置光标。阅读本
里诺


9

让editText2是您的第二个EditText视图。然后将以下代码放在onResume()中

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

或放

<requestFocus />

在第二个EditText视图的xml布局中。


7

有时如果我们直接使用文本光标不会移到特定的位置editText.setSelection(position);。在这种情况下,您可以尝试

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

7

如果要将光标放在EditText上的某个位置,可以使用:

yourEditText.setSelection(position);

此外,还可以设置初始位置和最终位置,以便通过编程方式选择一些文本,方法是:

yourEditText.setSelection(startPosition, endPosition);

请注意,由于您可以将光标放置在字符之前之后,因此设置选择可能会比较棘手,下图说明了在这种情况下如何进行索引工作:

在此处输入图片说明

因此,如果您希望光标位于文本的末尾,只需将其设置为即可yourEditText.length()


5

setSelection(int index)中的方法Edittext应允许您执行此操作。


4

提醒您:如果您正在使用edittext.setSelection()游标来设置光标,alertdialog例如在设置游标时它不起作用,请确保设置selection()在对话框创建后

例:

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


2

记得requestFocus()在之前致电setSelection以获取edittext。


1

我不会直接得到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);

1

如果要在n从右到左的字符后设置光标,则必须这样做。

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

如果edittext的文本像

version<sub></sub>

并且您想要将光标从右移到第6个位置

然后它将光标移动到

    version<sub> </sub>
                ^


1
if(myEditText.isSelected){
    myEditText.setSelection(myEditText.length())
    }

0

将光标设置为行和列

您可以使用以下代码来获取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()


0

在kotlin中,您可以创建一个扩展函数,如下所示:

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

然后简单地打电话 myEditText.placeCursorAtLast()


0

如果要在EditText中设置光标位置?试试下面的代码

EditText rename;
 String title = "title_goes_here";
 int counts = (int) title.length();
 rename.setSelection(counts);
 rename.setText(title);

0

如何解决光标位置问题,该问题在美国移动电话中格式化后会自动移动到最后一个位置,例如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);

-3

我相信最简单的方法就是使用填充。

在xml的edittext部分中说,添加android:paddingLeft =“ 100dp”,这会将光标100dp的起始位置从左端向右移动。

同样,您可以使用android:paddingRight =“ 100dp”,这会将光标100dp的结束位置从右端向左移动。

有关更多详细信息,请在我的博客上查看此文章:Android:在EditText小部件中设置光标的开始和结束位置


2
填充与光标位置无关,并且在这种特定情况下完全是错误的思想流派。
鲨鱼
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.