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

问题描述 投票:211回答:20

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

android android-edittext
20个回答
440
投票

position是int的位置:

editText1.setSelection(position)

3
投票

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

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

3
投票

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

yourEditText.setSelection(position);

此外,有可能设置初始和最终位置,以便您以编程方式选择一些文本,这样:

yourEditText.setSelection(startPosition, endPosition);

请注意,设置选择可能会很棘手,因为您可以将光标放在字符之前或之后,下图说明了在这种情况下如何编制索引:

enter image description here

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


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
投票
EditText editText = findViewById(R.id.editText);
editText.setSelection(editText.getText().length());

0
投票

Set cursor to a row and column

您可以使用以下代码获取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
投票

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

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

-1
投票

在kotlin中,您可以创建一个这样的扩展函数:

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

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


-2
投票

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

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

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

有关更多详细信息,请查看我的博客上的这篇文章:Android: Setting Cursor Starting and Ending Position in EditText Widget


92
投票

在这里以编程方式更新EditText的文本后,我已经这样做了将光标位置设置为文本的结尾,etmsg是EditText

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

-4
投票

在Xml文件中android:paddingLeft:

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

我希望这能帮助你


32
投票

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

Code下面是将光标设置为在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);

16
投票

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

在一个空的EditText中只有一个位置,它是setSelection(0)

或者你的意思是当你的活动开始时你想要关注你的EditText?在那种情况下它的requestFocus()


12
投票

使用以下行

e2.setSelection(e2.length());

e2是编辑文本对象名称


9
投票

让editText2是你的第二个EditText视图。然后在onResume()中放入以下代码片段

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

或者说

<requestFocus />

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


6
投票

有些时候编辑文本光标donot来到特定位置是我们直接使用editText.setSelection(position);。在这种情况下,你可以尝试

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

5
投票

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


4
投票

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

例:

AlertDialog dialog = builder.show();
input.setSelection(x,y);
© www.soinside.com 2019 - 2024. All rights reserved.