有两个EditText
,在加载页面时,第一个EditText中设置了一个文本,所以现在光标将位于EditText
的起始位置,我想设置光标位置在第二个EditText 中,它不包含任何数据。怎么做?
答案 0 :(得分:432)
where position是int:
editText1.setSelection(position)
答案 1 :(得分:92)
我已经这样做了以编程方式更新EditText文本后将光标位置设置为文本末尾
在这里,etmsg
是EditText
etmsg.setText("Updated Text From another Activity");
int position = etmsg.length();
Editable etext = etmsg.getText();
Selection.setSelection(etext, position);
答案 2 :(得分:31)
以下代码<{>>将光标设置为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);
答案 3 :(得分:14)
我想在edittext中设置不包含数据的光标位置
空的EditText只有一个位置,它是setSelection(0)
。
或者您的意思是您希望在活动开始时将注意力集中在EditText
上?在那种情况下,它是requestFocus()
答案 4 :(得分:11)
使用以下行
e2.setSelection(e2.length());
e2
是编辑文本对象名称
答案 5 :(得分:9)
让editText2成为你的第二个EditText视图。然后将以下代码放入 onResume()
editText2.setFocusableInTouchMode(true);
editText2.requestFocus();
或放
<requestFocus />
在第二个EditText视图的xml布局中。
答案 6 :(得分:6)
editText.setSelection(position);
,有些时候编辑文本光标不会出现在特定位置。
在这种情况下,您可以尝试
editText.post(new Runnable() {
@Override
public void run() {
editText.setSelection(string.length());
}
});
答案 7 :(得分:5)
setSelection(int index)
方法应该允许您执行此操作。
答案 8 :(得分:4)
作为提醒:如果您使用edittext.setSelection()
来设置光标,并且在设置alertdialog
时它不起作用,请务必在selection()
之后设置AlertDialog dialog = builder.show();
input.setSelection(x,y);
对话框已创建
示例:
{{1}}
答案 9 :(得分:3)
此代码可帮助您将光标显示在编辑文本的最后位置。
editText.requestFocus();
editText.setSelection(editText.length());
答案 10 :(得分:2)
请务必在编辑文字requestFocus()
之前致电setSelection
。
答案 11 :(得分:2)
如果要将光标放在EditText上的某个位置,可以使用:
yourEditText.setSelection(position);
此外,还可以设置初始位置和最终位置,以便您以编程方式选择一些文本,
yourEditText.setSelection(startPosition, endPosition);
请注意,由于您可以将光标放置在字符前 或 后,设置选择项可能会比较棘手,下图说明了在这种情况下如何建立索引:
因此,如果您希望光标位于文本的末尾,只需将其设置为yourEditText.length()
。
答案 12 :(得分:1)
我不会直接得到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);
答案 13 :(得分:1)
如果要在n
字符之后设置光标
从右到左然后你必须这样做。
edittext.setSelection(edittext.length()-n);
如果edittext的文字像
那样version<sub></sub>
并且您想要将光标从右侧移动到第6个位置
然后它会将光标移动到 -
version<sub> </sub>
^
答案 14 :(得分:1)
您可以这样使用:
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上使用它
答案 15 :(得分:1)
EditText editText = findViewById(R.id.editText);
editText.setSelection(editText.getText().length());
答案 16 :(得分:1)
if(myEditText.isSelected){
myEditText.setSelection(myEditText.length())
}
答案 17 :(得分:0)
我来回答这个问题太晚了,所以我弄清楚了。只需使用
android:gravity="center_horizontal"
答案 18 :(得分:0)
如何解决光标位置问题,该问题在美国移动电话中格式化后会自动移动到最后一个位置,例如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);
答案 19 :(得分:0)
是否要在EditText中设置光标位置?试试下面的代码
EditText rename;
String title = "title_goes_here";
int counts = (int) title.length();
rename.setSelection(counts);
rename.setText(title);
答案 20 :(得分:0)
您可以使用以下代码获取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()
。
答案 21 :(得分:-1)
在kotlin中,你可以创建一个像这样的扩展函数:
fun EditText.placeCursorAtLast() {
val string = this.text.toString()
this.setSelection(string.length)
}
然后只需致电myEditText.placeCursorAtLast()
答案 22 :(得分:-2)
我认为最简单的方法就是使用填充。
在你的xml的edittext部分中说,添加 机器人:paddingLeft = “100dp” 这会将光标100dp的起始位置从左端移动。
同样,你可以使用 机器人:paddingRight = “100dp” 这会将光标100dp的结束位置从右端移开。
有关详细信息,请查看我的博客上的文章:Android: Setting Cursor Starting and Ending Position in EditText Widget
答案 23 :(得分:-4)
在Xml文件中android:paddingLeft:
<EditText
android:id="@+id/txt_amount"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingLeft="10dp"/>
我希望这对您有帮助