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

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

位置是int的位置:

 editText1.setSelection(position) 

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

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

如何在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()); 

下面的代码是在第二个字符后设置光标位置:

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

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

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

或者你的意思是当你的活动打开时你想把焦点放到你的EditText ? 在这种情况下,它的requestFocus()

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

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

或放

 <requestFocus /> 

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

作为提示:如果您使用edittext.setSelection()设置光标,并且在设置alertdialog不工作,请确保在创建对话框后设置selection()

例:

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

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

使用下面的行

 e2.setSelection(e2.length()); 

e2是编辑文本对象名称

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

如果你想从右向左设置n字符,那么你必须这样做。

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

如果edittext的文字像

 version<sub></sub> 

而你想把光标从右边移到第六个位置

然后它将光标移到 –

  version<sub> </sub> ^ 

如果我们直接使用editText.setSelection(position);那么在某些时候编辑文本光标就不会出现在特定的位置editText.setSelection(position); 。 在这种情况下,你可以尝试

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

记住在setSelection for edittext之前调用requestFocus()

将光标设置为行和列

您可以使用下面的代码来获取您的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()那样返回一个忽略文本换行的行数。

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

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

然后只需调用myEditText.placeCursorAtLast()

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

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

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

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

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

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