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

Java 将光标放在EditText中文本的末尾,java,android,kotlin,android-edittext,keylistener,Java,Android,Kotlin,Android Edittext,Keylistener,我正在更改keyListener上的EditText的值 但是当我更改文本时,光标移动到EditText的开头。 我需要光标在文本的末尾 如何在EditText中将光标移动到文本的末尾,您应该能够借助EditText的方法setSelection()实现这一点,请参见尝试以下操作: 更新: editText.setSelection(editText.text.toString().length)//placing cursor at the end of the text editText.

我正在更改
keyListener
上的
EditText
的值

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


如何在
EditText
中将光标移动到文本的末尾,您应该能够借助
EditText的
方法
setSelection()
实现这一点,请参见尝试以下操作:

更新:

editText.setSelection(editText.text.toString().length)//placing cursor at the end of the text
editText.setSelection(editText.getText().length());
val editText = findViewById(R.id.edittext_id) as EditText
editText.setSelection(2)
EditText editText = (EditText)findViewById(R.id.edittext_id);
editText.setSelection(2);
Kotlin:

editText.setSelection(editText.text.toString().length)//placing cursor at the end of the text
editText.setSelection(editText.getText().length());
val editText = findViewById(R.id.edittext_id) as EditText
editText.setSelection(2)
EditText editText = (EditText)findViewById(R.id.edittext_id);
editText.setSelection(2);
Java:

editText.setSelection(editText.text.toString().length)//placing cursor at the end of the text
editText.setSelection(editText.getText().length());
val editText = findViewById(R.id.edittext_id) as EditText
editText.setSelection(2)
EditText editText = (EditText)findViewById(R.id.edittext_id);
editText.setSelection(2);

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


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

 Editable etext = mSubjectTextEditor.getText();
 Selection.setSelection(etext, etext.length());
EditText editText = findViewById(R.id.editText);
editText.setSelection(editText.getText().length());

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

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

如果您之前调用了
setText
,而新文本没有得到布局阶段,则在由
View.post(runnable)
(从主题重新发布)触发的单独runnable中调用
setSelection

所以,对我来说,这段代码是有效的:

editText.setText("text");
editText.post(new Runnable() {
         @Override
         public void run() {
             editText.setSelection(editText.getText().length());
         }
});
编辑2019年5月16日:现在我正在使用Kotlin扩展:

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

然后-editText.placeCursorToEnd()。

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

et.append("");
如果此解决方案因任何原因无效,请尝试此解决方案:

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

这对我有好处

类似于@Anh Duy的答案,但对我来说不起作用。我还需要光标移动到最后,只有当用户点击编辑文本,仍然能够选择光标的位置后,这是唯一的代码,为我工作

boolean textFocus = false; //define somewhere globally in the class

//in onFinishInflate() or somewhere
editText.setOnTouchListener(new OnTouchListener() {
    @Override
    public boolean onTouch(View v, MotionEvent event) {

        editText.onTouchEvent(event);

        if(!textFocus) {
            editText.setSelection(editText.getText().length());
            textFocus = true;
        }

        return true;
    }
});

editText.setOnFocusChangeListener(new OnFocusChangeListener() {
    @Override
    public void onFocusChange(View v, boolean hasFocus) {
        textFocus = false;
    }
});

这会安全地完成以下操作:

    editText.setText("");
    if (!TextUtils.isEmpty(text)) {
        editText.append(text);
    }

如果您的编辑文本不清晰:

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


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

    android:selectAllOnFocus="true"

所有我测试过的其他代码都不好,因为用户仍然可以将插入符号/光标放置在字符串的中间(例如:12×3——其中是光标)。每当触摸文本时,我的解决方案总是将光标放在字符串的末尾

最终的解决办法是:

// For a EditText like:
<EditText
                android:id="@+id/EditTextAmount"
                android:layout_height="wrap_content"
                android:layout_width="fill_parent"
                android:hint="@string/amount"
                android:layout_weight="1"
                android:text="@string/zero_value"
                android:inputType="text|numberDecimal"
                android:maxLength="13"/>
//对于编辑文本,如:
@字符串/金额=“0.00” @字符串/zero_value=“0.00”

//创建一个静态布尔标志
私有静态布尔值;
//将插入符号/光标设置为焦点更改时的结尾
EditTextAmount.setOnFocusChangeListener(新视图.OnFocusChangeListener(){
@凌驾
public void onFocusChange(查看编辑文本,布尔hasFocus){
如果(hasFocus){
((EditText)EditText.setSelection(((EditText)EditText.getText().length());
}
}
});
/创建一个触摸侦听器并将插入符号放在末尾(无论用户在字符串中间触摸的位置)
EditTextAmount.setOnTouchListener(新视图.OnTouchListener(){
@凌驾
公共布尔onTouch(查看编辑文本、运动事件){
((EditText)EditText.onTouchEvent(事件);
((EditText)EditText.setSelection(((EditText)EditText.getText().length());
返回true;
}
});
//使用addTextChangedListener实现货币掩码
EditTextAmount.addTextChangedListener(新的TextWatcher(){
@凌驾
public void onTextChanged(字符序列、int start、int before、int count){
字符串输入=s.toString();
字符串输出=新字符串();
字符串缓冲区=新字符串();
字符串小数=新字符串();
字符串编号=Integer.toString(Integer.parseInt(input.replaceAll(“[^0-9]”,“”));
如果(返回下一个){
returnNext=false;
返回;
}
returnNext=true;
if(数字等于(“0”)){
输出+=“0.00”;
}
else if(number.length()=3){
小数=numbers.substring(numbers.length()-2);
int commaCounter=0;
对于(int i=numbers.length()-3;i>=0;i--){
如果(commaCounter==3){
缓冲区+=“,”;
通信计数器=0;
}
缓冲区+=数字。字符(i);
commaCounter++;
}
输出=新的StringBuilder(缓冲区).reverse().toString()+“+”+小数;
}
EditTextAmount.setText(输出);
EditTextAmount.setSelection(EditTextAmount.getText().length());
}
@凌驾
更改前文本之前的公共void(字符序列s、int start、int count、int after){
/*字符串输入=s.toString();
if(输入等于(“0.0”)){
EditTextAmount.setText(“0.00”);
EditTextAmount.setSelection(EditTextAmount.getText().length());
返回;
}*/
}
@凌驾
公共无效后文本已更改(可编辑){
}
});
希望有帮助

这很有效

Editable etext = edittext.getText();
Selection.setSelection(etext,edittext.getText().toString().length());

Kotlin

val editText = findViewById(R.id.edittext_id) as EditText
editText.setSelection(0)
val editText = findViewById(R.id.edittext_id) as EditText
editText.setSelection(editText.text.length)
 EditText editText = (EditText)findViewById(R.id.edittext_id);
 editText.setSelection(0);
EditText editText = (EditText)findViewById(R.id.edittext_id);
editText.setSelection(editText.getText().length());
将光标设置到起始位置:

val editText = findViewById(R.id.edittext_id) as EditText
editText.setSelection(0)
val editText = findViewById(R.id.edittext_id) as EditText
editText.setSelection(editText.text.length)
 EditText editText = (EditText)findViewById(R.id.edittext_id);
 editText.setSelection(0);
EditText editText = (EditText)findViewById(R.id.edittext_id);
editText.setSelection(editText.getText().length());
将光标设置到编辑文本的末尾:

val editText = findViewById(R.id.edittext_id) as EditText
editText.setSelection(0)
val editText = findViewById(R.id.edittext_id) as EditText
editText.setSelection(editText.text.length)
 EditText editText = (EditText)findViewById(R.id.edittext_id);
 editText.setSelection(0);
EditText editText = (EditText)findViewById(R.id.edittext_id);
editText.setSelection(editText.getText().length());
下面的代码将光标放在第二个字符之后:

editText.setSelection(editText.text.toString().length)//placing cursor at the end of the text
editText.setSelection(editText.getText().length());
val editText = findViewById(R.id.edittext_id) as EditText
editText.setSelection(2)
EditText editText = (EditText)findViewById(R.id.edittext_id);
editText.setSelection(2);
JAVA

val editText = findViewById(R.id.edittext_id) as EditText
editText.setSelection(0)
val editText = findViewById(R.id.edittext_id) as EditText
editText.setSelection(editText.text.length)
 EditText editText = (EditText)findViewById(R.id.edittext_id);
 editText.setSelection(0);
EditText editText = (EditText)findViewById(R.id.edittext_id);
editText.setSelection(editText.getText().length());
将光标设置到起始位置:

val editText = findViewById(R.id.edittext_id) as EditText
editText.setSelection(0)
val editText = findViewById(R.id.edittext_id) as EditText
editText.setSelection(editText.text.length)
 EditText editText = (EditText)findViewById(R.id.edittext_id);
 editText.setSelection(0);
EditText editText = (EditText)findViewById(R.id.edittext_id);
editText.setSelection(editText.getText().length());
将光标设置到编辑文本的末尾:

val editText = findViewById(R.id.edittext_id) as EditText
editText.setSelection(0)
val editText = findViewById(R.id.edittext_id) as EditText
editText.setSelection(editText.text.length)
 EditText editText = (EditText)findViewById(R.id.edittext_id);
 editText.setSelection(0);
EditText editText = (EditText)findViewById(R.id.edittext_id);
editText.setSelection(editText.getText().length());
下面的代码将光标放在第二个字符之后:

editText.setSelection(editText.text.toString().length)//placing cursor at the end of the text
editText.setSelection(editText.getText().length());
val editText = findViewById(R.id.edittext_id) as EditText
editText.setSelection(2)
EditText editText = (EditText)findViewById(R.id.edittext_id);
editText.setSelection(2);
在XML文件中使用此CustomEditText,这将起作用。我已经测试过了,它对我有效。