有两个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);
etmsg.setText("my new text..."); etmsg.setSelection(etmsg.length());
如何在 Android 中设置 EditText 光标位置
下面的代码是在 EditText
中将光标设置为开始:
EditText editText = (EditText)findViewById(R.id.edittext_id);
editText.setSelection(0);
下面的代码是 EditText
的Set cursor to end:
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 中只有一个位置,它是 setSelection(0)
。
或者您的意思是当您的活动打开时您想将注意力集中在您的 EditText
上?在这种情况下,它的 requestFocus()
让 editText2 是您的第二个 EditText 视图。然后将以下代码放入 onResume()
editText2.setFocusableInTouchMode(true);
editText2.requestFocus();
或放
<requestFocus />
在第二个 EditText 视图的 xml 布局中。
使用下面的行
e2.setSelection(e2.length());
e2
是编辑文本对象名称
如果要将光标放在 EditText 上的某个位置,可以使用:
yourEditText.setSelection(position);
此外,还可以设置初始位置和最终位置,以便您以编程方式选择一些文本,这样:
yourEditText.setSelection(startPosition, endPosition);
请注意,设置选择可能很棘手,因为您可以将光标放在字符之前或之后,下图说明了在这种情况下如何进行索引:
https://i.stack.imgur.com/NG1nc.png
因此,如果您希望光标位于文本末尾,只需将其设置为 yourEditText.length()
。
如果我们直接使用 editText.setSelection(position);
,有时编辑文本光标不会出现在特定位置。在这种情况下,您可以尝试
editText.post(new Runnable() {
@Override
public void run() {
editText.setSelection(string.length());
}
});
Edittext
中的 setSelection(int index)
方法应该允许您执行此操作。
提醒一下:如果您使用 edittext.setSelection()
设置光标,并且在设置 alertdialog
时它不起作用,请确保在创建对话框后设置 selection()
例子:
AlertDialog dialog = builder.show();
input.setSelection(x,y);
此代码将帮助您将光标显示在编辑文本的最后一个位置。
editText.requestFocus();
editText.setSelection(editText.length());
请记住在 setSelection
之前调用 requestFocus()
以获取 edittext。
你可以这样使用:
if (your_edittext.getText().length() > 0 ) {
your_edittext.setSelection(your_edittext.getText().length());
}
您可以将此行添加到您的 EditText xml
android:gravity="right"
android:ellipsize="end"
android:paddingLeft="10dp"//you set this as you need
但是当任何文本写作时,你应该将 paddingleft 设置为零
你应该在 addTextChangedListener 上使用它
我不会直接获得 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>
并且您想将光标移动到右侧第 6 个位置
然后它将光标移动到-
version<sub> </sub>
^
EditText editText = findViewById(R.id.editText);
editText.setSelection(editText.getText().length());
if(myEditText.isSelected){
myEditText.setSelection(myEditText.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()
不同。
在 kotlin 中,你可以像这样创建一个扩展函数:
fun EditText.placeCursorAtLast() {
val string = this.text.toString()
this.setSelection(string.length)
}
然后只需调用 myEditText.placeCursorAtLast()
如果要在 EditText 中设置光标位置?试试下面的代码
EditText rename;
String title = "title_goes_here";
int counts = (int) title.length();
rename.setSelection(counts);
rename.setText(title);
如何解决在美国移动格式化后光标位置自动移动到最后一个位置的问题,如 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 定义以下方法 Activity 名称是 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);
我这么晚才回答这个问题,所以我想通了。只需使用,
android:gravity="center_horizontal"
我相信最简单的方法就是使用填充。
在你的 xml 的 edittext 部分说,添加 android:paddingLeft="100dp" 这会将光标的起始位置从左端向右移动 100dp。
同样,您可以使用 android:paddingRight="100dp" 这会将光标的结束位置从右端向左移动 100dp。
有关更多详细信息,请查看这篇文章在我的博客上:Android: Setting Cursor Starting and Ending Position in EditText Widget