有两个EditText,在加载页面时,在第一个EditText中设置了一个文本,所以现在光标将位于EditText的起始位置,我想在第二个EditText中设置光标的位置,其中不包含数据。如何做到这一点?
当前回答
我用这种方法在以编程方式更新EditText文本后,将光标位置设置为文本的末尾 这里,etmsg是EditText
etmsg.setText("Updated Text From another Activity");
int position = etmsg.length();
Editable etext = etmsg.getText();
Selection.setSelection(etext, position);
其他回答
将游标设置为行和列
您可以使用下面的代码获取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()。
Edittext中的setSelection(int index)方法应该允许您这样做。
我不会得到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);
你可以这样用:
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
但当任何文本写入时,你应该将左填充设置为零
你应该在addTextChangedListener上使用这个
如何解决在US Mobile中格式化后自动移动到最后一个位置的光标位置问题,如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);
推荐文章
- 如何隐藏动作栏之前的活动被创建,然后再显示它?
- 是否有一种方法以编程方式滚动滚动视图到特定的编辑文本?
- 在Android中将字符串转换为Uri
- 如何在NestedScrollView内使用RecyclerView ?
- 移动到另一个EditText时,软键盘下一步点击Android
- Android应用中的GridView VS GridLayout
- Activity和FragmentActivity的区别
- 右对齐文本在android TextView
- 权限拒绝:start前台需要android.permission.FOREGROUND_SERVICE
- 如何更改android操作栏的标题和图标
- Android Split字符串
- 让一个链接在安卓浏览器启动我的应用程序?
- 如何在Android工作室的外部库中添加一个jar ?
- GridLayout(不是GridView)如何均匀地拉伸所有子元素
- 如何让一个片段删除自己,即它的等效完成()?