将光标放置在EditText文本末尾

1061

我在keyListener上更改了一个EditText的值。

但是当我更改文本时,光标会移动到EditText的开头。 我需要光标在文本末尾。

如何将光标移动到EditText的末尾。


3
我遇到了相同的问题。但更好地问自己的是为什么会发生这种情况,这样我就可以在之前解决问题,而不必自己移动光标。 - kaneda
5
我完全同意,不过如果你能提供实际解决方案会更有帮助。 - AgentKnopf
1
@Zainodis 这只是一个想法。像我说的那样,我遇到了同样的问题,这并不一定意味着我已经找到了解决方案。在我的情况下,我有一个ListView中作为项目的EditText的问题。至于实验,我对ListView源代码进行了一些更改,这是一个相当复杂的东西,并在模拟器上进行了测试。它与组件所做的焦点控制管理有关。所以当然,这不是我可以给我们的朋友帮助的解决方案。 :) - kaneda
2
可能是Android EditText - setText方法光标问题的重复问题。 - AZ_
这个在 OnFocusChanged 回调中不起作用。解决方法是将 setSelection 放入一个可运行的对象中,并在主线程上运行它。请参考此处 https://dev59.com/e4rda4cB1Zd3GeqPHxcg#32156989 - Ali Nem
28个回答

1538

试试这个:

更新:

Kotlin:

editText.setSelection(editText.length())//placing cursor at the end of the text

Java:

editText.setSelection(editText.getText().length());

19
在我的情况下这不起作用。setSelection()方法似乎没有效果。我的EditText视图包含ImageSpans。是否有其他解决方法? - Etienne Lawlor
6
嘿 @Mullay,我现在通过重写EditText类的onSelectionChanged()方法来处理它:public void onSelectionChanged(int start, int end) { CharSequence text = getText(); if (text != null) { if (start != text.length() || end != text.length()) { setSelection(text.length(), text.length()); return; } } super.onSelectionChanged(start, end); } - Etienne Lawlor
28
你可能需要使用 et.post(new Runnable({... et.setSel... 将其放入队列中。这是因为Android会在更合适的时间发布一些布局内容,如果你在系统完成前尝试设置选择,它将撤销你的工作。 - MinceMan
1
在这里运行正常,谢谢你的回答。但是你应该这样做: editText.setText(s); editText.setSelection(editText.getText().length()); // 在setText之后 - smileVann
方法名称选择不够恰当!不够直观! - Ahmed Hegazy
显示剩余2条评论

243

有一个名为append的函数,用于在编辑框中将字符串值附加到当前值并将光标放置在该值的末尾。您可以将当前编辑框值作为字符串值本身,然后调用append()函数。

myedittext.append("current_this_edittext_string"); 

1
如果您已经在EditText中输入了文本,只需编写myedittext.append("");即可。 - ymerdrengene
4
@ymerdrengene 只是简单地使用 myedittext.append(""); 并不能让我成功! - Chintan Shah
4
这很完美,因为它只是替换了我原来的一行代码。之前是使用edittextfield.setText,现在只需要将其替换为append。非常简单。 - theblitz
根据使用情况而定,是否有效。对我来说并没有。在我看来,使用“Selection”是实现这一目标的正确方式。 - sud007

166

Kotlin:

将光标设置为起始位置

val editText = findViewById(R.id.edittext_id) as EditText
editText.setSelection(0)

将光标设置到EditText的末尾

val editText = findViewById(R.id.edittext_id) as EditText
editText.setSelection(editText.text.length)

以下代码是将光标放置在第二个字符之后:

val editText = findViewById(R.id.edittext_id) as EditText
editText.setSelection(2)

JAVA

将光标设置为起始位置

 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());

以下代码是将光标放置在第二个字符之后:

EditText editText = (EditText)findViewById(R.id.edittext_id);
editText.setSelection(2);

2
可以使用findViewById<EditText>(R.id.edittext_id)替代findViewById(R.id.edittext_id) as EditText,或者直接避免转换(如果使用API 26+)。 - Evin1_

138
如果您在调用`setText`之前,新文本没有进行布局阶段,则通过`View.post(Runnable)`触发的单独运行线程中调用`setSelection`方法(来自此主题的转帖:链接)。
所以,对我而言,以下代码有效:
editText.setText("text");
editText.post(new Runnable() {
         @Override
         public void run() {
             editText.setSelection(editText.getText().length());
         }
});

编辑于05/16/2019:现在我正在使用Kotlin扩展实现此功能:

fun EditText.placeCursorToEnd() {
    this.setSelection(this.text.length)
}

然后 - editText.placeCursorToEnd()。


谢谢,这对我真的很有用。我一直在尝试调用setSelection,但它不起作用。在我的情况下,我正在尝试为编辑文本设置一个固定前缀,因此在设置前缀后,我需要将光标设置到前缀的末尾,以便用户可以在前缀之后输入数据。由于我在TextWatcher的构造函数中执行了setSelection,可能这就是为什么它没有起作用的原因。但是你的解决方案非常好! - Wand Maker
我在我的MultiAutoCompleteTextView的Clickablespan方法中使用了这个post方法,它可以正常工作......当文本范围内的删除图标被点击时,我希望光标移动到末尾......它在所有最新的Android手机上都可以正常工作......但在旧版本中,第一次点击后需要一些时间......我的其他项目都无法点击......有什么线索吗? - VijayRaj
1
我不知道为什么,但这是唯一一个对我起作用的!我的编辑文本拥有焦点/文本更改监听器,并被包装在 TextInputLayout 中。其中一个东西搞砸了它。 - Daniel Wilson

44

您也可以像这样将光标放置在EditText视图中文本的末尾:

EditText et = (EditText)findViewById(R.id.textview);
int textLength = et.getText().length();
et.setSelection(textLength, textLength);

31
editText.setOnKeyListener(new View.OnKeyListener() {
    @Override
    public boolean onKey(View v, int keyCode, KeyEvent event) {
        editText.setSelection(editText.getText().length());
        return false;
    }
});

26

在我的情况下,我创建了以下Kotlin扩展函数,可能对某些人有用:

private fun EditText.focus(){
    requestFocus()
    setSelection(length())
}

然后按如下方式使用:

mEditText.focus()

请求焦点很棒。谢谢。 - Reza

23

这是另一种可能的解决方案:

et.append("");

如果由于任何原因这个解决方案不能工作,只需尝试这个:

et.setSelection(et.getText().length());

14

您可以借助EditTextsetSelection()方法来实现此目标,详情请参见此处


14

如果您的EditText不清晰:

editText.setText("");
editText.append("New text");
editText.setText(null);
editText.append("New text");

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接