如何在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
不工作,请确保在创build对话框后设置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)
转到最后一行的最后一列
所有行和列边界都被处理; input大于行长度的列将返回行最后一列的位置。 input大于EditText的行数的行将进入最后一行。 它应该是可靠的,因为它经过了严格的testing。
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; }
这个问题已经回答了,但是我认为有人可能想要这样做。
它通过遍历每个字符来工作,每find一个行分隔符就增加行数。 如果行数等于所需行数,则返回当前索引+列,如果列超出范围,则返回行结束索引。 你也可以重用getTrueLineCount()
方法,它不像TextView.getLineCount()
那样返回一个忽略文本换行的行数。
在kotlin中,你可以像这样创build一个扩展函数:
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中设置光标开始和结束位置