有两个EditText,在加载页面时,在第一个EditText中设置了一个文本,所以现在光标将位于EditText的起始位置,我想在第二个EditText中设置光标的位置,其中不包含数据。如何做到这一点?
当前回答
如果你想把光标放在EditText上的某个位置,你可以使用:
yourEditText.setSelection(position);
此外,还可以设置初始位置和最终位置,这样你就可以通过编程方式选择一些文本,如下所示:
yourEditText.setSelection(startPosition, endPosition);
请注意,设置选择可能很棘手,因为你可以把光标放在字符的前面或后面,下图解释了在这种情况下如何建立索引:
因此,如果您希望光标位于文本的末尾,只需将其设置为yourEditText.length()。
其他回答
让editText2是你的第二个EditText视图。然后将以下代码放在onResume()中
editText2.setFocusableInTouchMode(true);
editText2.requestFocus();
或者把
<requestFocus />
在第二个EditText视图的xml布局中。
将游标设置为行和列
您可以使用下面的代码获取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()。
其中position为int型:
editText1.setSelection(position)
我相信最简单的方法就是使用填充。
Say in your xml's edittext section, add android: paddingLeft = " 100 dp” This will move your start position of cursor 100dp right from left end.
同理,你可以用 android: paddingRight = " 100 dp” 这将把你的光标的结束位置从右端向左移动100dp。
要了解更多细节,请查看我博客上的这篇文章:Android:在EditText Widget中设置光标的起始和结束位置
提醒一下:如果你正在使用edittext.setSelection()来设置光标,并且它在设置alertdialog时不起作用,请确保在对话框创建后设置selection()
例子:
AlertDialog dialog = builder.show();
input.setSelection(x,y);
推荐文章
- 如何改变菜单项的文本颜色在安卓?
- Android选择器和文本颜色
- 视图绑定-我如何获得包含布局的绑定?
- 在Android Studio中改变矢量资产的填充颜色
- 在构建中编写注释的语法是什么?gradle文件?
- 如何以编程方式添加按钮色调
- 用Android Studio进行调试永远停留在“等待调试器”状态
- Openssl不被视为内部或外部命令
- 无法执行dex:在Eclipse中超过GC开销限制
- 如何以编程方式将视图添加到视图
- 单击url会打开默认浏览器
- 使用Retrofit刷新OAuth令牌,而不修改所有调用
- 多个dex文件定义了landoid /support/v4/accessibilityservice/AccessibilityServiceInfoCompat
- 如何获得动作栏的高度?
- 从活动外部调用startActivity() ?