将光标放在EditText中文本的末尾

Man*_*anu 839 android keylistener android-edittext

我改变的价值EditTextkeyListener.

但是当我改变文本时,光标移动到了文本的开头EditText.我需要光标位于文本的末尾.

如何将光标移动到文本的末尾EditText.

Mar*_*rqs 1270

试试这个:

EditText et = (EditText)findViewById(R.id.inbox);
et.setSelection(et.getText().length());
Run Code Online (Sandbox Code Playgroud)

  • 你可能不得不使用et.post(新的Runnable({... et.setSel ...进入队列.这是因为android等待做一些布局的东西,直到更好的时间发布所以如果你尝试setSelection在系统完成之前,它将撤消你的工作. (18认同)
  • 这在我的情况下不起作用.setSelection()方法似乎没有任何效果.我的EditText视图包含ImageSpans.还有其他一些解决方法吗? (12认同)
  • et.setSelection(et.length()); 也有效 (9认同)
  • 嘿@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()); 返回; super.onSelectionChanged(start,end); }` (3认同)

Jam*_*mes 216

有一个名为append for ediitext的函数,它将字符串值附加到当前的edittext值,并将光标放在值的末尾.您可以将字符串值作为当前ediitext值本身并调用append();

myedittext.append("current_this_edittext_string"); 
Run Code Online (Sandbox Code Playgroud)

  • @ymerdrengene只是应用`myedittext.append("");`对我没有用! (4认同)
  • 这很完美,因为它只是取代了我的代码行.正在使用edittextfield.setText并将其交换为append.非常简单. (4认同)

Mr.*_*tel 122

科特林:

将光标设置为起始位置:

val editText = findViewById(R.id.edittext_id) as EditText
editText.setSelection(0)
Run Code Online (Sandbox Code Playgroud)

将光标设置为EditText末尾:

val editText = findViewById(R.id.edittext_id) as EditText
editText.setSelection(editText.text.length)
Run Code Online (Sandbox Code Playgroud)

Code下面是将光标放在第二个字符后面:

val editText = findViewById(R.id.edittext_id) as EditText
editText.setSelection(2)
Run Code Online (Sandbox Code Playgroud)

JAVA:

将光标设置为起始位置:

 EditText editText = (EditText)findViewById(R.id.edittext_id);
 editText.setSelection(0);
Run Code Online (Sandbox Code Playgroud)

将光标设置为EditText末尾:

EditText editText = (EditText)findViewById(R.id.edittext_id);
editText.setSelection(editText.getText().length());
Run Code Online (Sandbox Code Playgroud)

Code下面是将光标放在第二个字符后面:

EditText editText = (EditText)findViewById(R.id.edittext_id);
editText.setSelection(2);
Run Code Online (Sandbox Code Playgroud)

  • 可以将“findViewById(R.id.edittext_id) as EditText”替换为“findViewById<EditText>(R.id.edittext_id)”,或者在使用“API 26+”时避免强制转换 (2认同)

Ant*_*nko 75

如果你打电话setText之前,新的案文没有得到布局阶段的呼叫setSelection在一个单独运行的燃煤通过View.post(Runnable)(从重新发布这个话题).

所以,对我来说这个代码有效:

editText.setText("text");
editText.post(new Runnable() {
         @Override
         public void run() {
             registerPhone.setSelection("text".length());
         }
});
Run Code Online (Sandbox Code Playgroud)


too*_*o42 41

您还可以将光标放在EditText视图中文本的末尾,如下所示:

EditText et = (EditText)findViewById(R.id.textview);
int textLength = et.getText().length();
et.setSelection(textLength, textLength);
Run Code Online (Sandbox Code Playgroud)


小智 27

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


Kre*_*nik 21

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

et.append("");
Run Code Online (Sandbox Code Playgroud)

如果它因任何原因不起作用,请尝试此解决方案:

et.setSelection(et.getText().length());
Run Code Online (Sandbox Code Playgroud)


Max*_*mus 12

您应该能够使用EditText的方法setSelection()实现这一点,请参阅此处


小智 12

在我的情况下,我创建了以下kotlin ext.功能,可能对某人有用

 private fun EditText.focus(){
        requestFocus()
        setSelection(length())
    }
Run Code Online (Sandbox Code Playgroud)

然后使用如下

mEditText.focus()
Run Code Online (Sandbox Code Playgroud)


Anh*_*Duy 11

/**
 * Set cursor to end of text in edittext when user clicks Next on Keyboard.
 */
View.OnFocusChangeListener onFocusChangeListener = new View.OnFocusChangeListener() {
    @Override
    public void onFocusChange(View view, boolean b) {
        if (b) {
            ((EditText) view).setSelection(((EditText) view).getText().length());
        }
    }
};

mEditFirstName.setOnFocusChangeListener(onFocusChangeListener); 
mEditLastName.setOnFocusChangeListener(onFocusChangeListener);
Run Code Online (Sandbox Code Playgroud)

它对我有用!


Li *_*Che 10

我认为这可以实现你想要的.

 Editable etext = mSubjectTextEditor.getText();
 Selection.setSelection(etext, etext.length());
Run Code Online (Sandbox Code Playgroud)


Leo*_*der 9

如果您的EditText不清楚:

editText.setText("");
editText.append("New text");
Run Code Online (Sandbox Code Playgroud)


djl*_*eop 9

这个问题已经过时并且已经回答了,但我认为如果您想使用Android最新发布的DataBinding工具,只需在XML中设置它就可能有用这个答案:

<data>
    <variable name="stringValue" type="String"/>
</data>
...
<EditText
        ...
        android:text="@={stringValue}"
        android:selection="@{stringValue.length()}"
        ...
/>
Run Code Online (Sandbox Code Playgroud)


Rah*_*til 6

在此输入图像描述

你好试试这个

 <EditText
       android:id="@+id/edt_text"
       android:layout_width="match_parent"
       android:layout_height="wrap_content"
       android:text="Hello World!"
       android:cursorVisible="true"/>
Run Code Online (Sandbox Code Playgroud)

EditText editText = findViewById(R.id.editText); editText.setSelection(editText.getText().length()); // End point光标


Yog*_*ity 6

对于 ViewModel、LiveData 和数据绑定

\n\n

我需要此功能来EditText在我的笔记应用程序中提供多行支持。当用户导航到具有注释文本的片段时,我希望光标位于文本末尾。

\n\n

djleop建议的解决方案很接近。但这样做的问题是,如果用户将光标放在文本中间的某个位置进行编辑并开始输入,光标将再次跳到文本末尾。发生这种情况是因为LiveData会发出新值,并且光标会再次跳到文本末尾,导致用户无法在中间某处编辑文本。

\n\n

为了解决这个问题,我使用标志MediatorLiveData并为其分配仅一次的长度。String这将导致 LiveData 仅读取该值一次,即当用户导航到片段时。之后,用户可以将光标放置在他们想要编辑文本的任何位置。

\n\n

视图模型

\n\n
private var accessedPosition: Boolean = false\n\nval cursorPosition = MediatorLiveData<Event<Int>>().apply {\n    addSource(yourObject) { value ->\n        if(!accessedPosition) {\n            setValue(Event(yourObject.note.length))\n            accessedPosition = true\n        }\n    }\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

这里yourObject是从数据库检索的另一个 LiveData,它保存您在EditText.

\n\n

MediatorLiveData然后使用绑定适配器将其绑定到您的 EditText。

\n\n

XML

\n\n

使用双向数据绑定来显示文本以及接受文本输入。

\n\n
<!-- android:text must be placed before cursorPosition otherwise we\'ll get IndexOutOfBounds exception-->\n<EditText\n    android:text="@={viewModel.noteText}"\n    cursorPosition="@{viewModel.cursorPosition}" />\n
Run Code Online (Sandbox Code Playgroud)\n\n

绑定适配器

\n\n
@BindingAdapter("cursorPosition")\nfun bindCursorPosition(editText: EditText, event: Event<Int>?) {\n    event?.getContentIfNotHandled()?.let { editText.setSelection(it) }\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

Event班级

\n\n

这里的类Event就像Google 的 Jose Alc\xc3\xa9rreca 编写的SingleLiveEvent。我在这里用它来处理屏幕旋转。使用单Event将确保当用户在中间某处编辑文本并且屏幕旋转时光标不会跳到文本末尾。当屏幕旋转时,它将保持相同的位置。

\n\n

这是班级Event

\n\n
open class Event<out T>(private val content: T) {\n\n    var hasBeenHandled = false\n        private set // Allow external read but not write\n\n    /**\n     * Returns the content and prevents its use again.\n     */\n    fun getContentIfNotHandled(): T? {\n        return if (hasBeenHandled) {\n            null\n        } else {\n            hasBeenHandled = true\n            content\n        }\n    }\n\n    /**\n     * Returns the content, even if it\'s already been handled.\n     */\n    fun peekContent(): T = content\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

这是适合我并提供良好用户体验的解决方案。希望它对您的项目也有帮助。

\n


ar-*_*r-g 5

如果要选择所有文本,而只输入新文本而不是旧文本,则可以使用

    android:selectAllOnFocus="true"
Run Code Online (Sandbox Code Playgroud)


小智 5

这有效

Editable etext = edittext.getText();
Selection.setSelection(etext,edittext.getText().toString().length());
Run Code Online (Sandbox Code Playgroud)


Khe*_*raj 5

editText.setSelection是这里的魔力。基本上,选择可使您将光标放置在所需的任何位置。

EditText editText = findViewById(R.id.editText);
editText.setSelection(editText.getText().length());
Run Code Online (Sandbox Code Playgroud)

这会将光标置于EditText的末尾。基本上editText.getText().length()给您文本长度。然后,您可以使用setSelection长度。

editText.setSelection(0);

用于将光标设置在起始位置(0)。