Answers:
如果位置是一个整数:
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());
下面的代码将光标设置为开始于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);
我想在不包含数据的edittext中设置光标位置
空的EditText中只有一个位置,即setSelection(0)
。
还是您是说您想EditText
在活动开始时专注于自己?在这种情况下 requestFocus()
使用下面的行
e2.setSelection(e2.length());
e2
是编辑文本对象名称
此代码将帮助您在编辑文本的最后位置显示光标。
editText.requestFocus();
editText.setSelection(editText.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()
。
如何解决光标位置问题,该问题在美国移动电话中格式化后会自动移动到最后一个位置,例如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);
我相信最简单的方法就是使用填充。
在xml的edittext部分中说,添加android:paddingLeft =“ 100dp”,这会将光标100dp的起始位置从左端向右移动。
同样,您可以使用android:paddingRight =“ 100dp”,这会将光标100dp的结束位置从右端向左移动。
有关更多详细信息,请在我的博客上查看此文章:Android:在EditText小部件中设置光标的开始和结束位置