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

我正在改变keyListenerEditText的值。

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

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

349050 次浏览

您应该能够在EditText's方法setSelection()的帮助下实现这一点,请参阅这里

试试这个:

更新:

静态编程语言:

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

Java:

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

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

myedittext.append("current_this_edittext_string");

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

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

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

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

如果您之前调用setText并且新文本没有在View.post(Runnable)触发的单独可运行文件中获得布局阶段调用setSelection(从这个主题重新发布)。

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

editText.setText("text");editText.post(new Runnable() {@Overridepublic void run() {editText.setSelection(editText.getText().length());}});

编辑05/16/2019:现在我正在使用静态编程语言扩展:

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

然后-editText.placeCursorToEnd()。

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

et.append("");

只要试试这个解决方案,如果它因任何原因不起作用:

et.setSelection(et.getText().length());
editText.setOnKeyListener(new View.OnKeyListener() {@Overridepublic boolean onKey(View v, int keyCode, KeyEvent event) {editText.setSelection(editText.getText().length());return false;}});
/*** Set cursor to end of text in edittext when user clicks Next on Keyboard.*/View.OnFocusChangeListener onFocusChangeListener = new View.OnFocusChangeListener() {@Overridepublic void onFocusChange(View view, boolean b) {if (b) {((EditText) view).setSelection(((EditText) view).getText().length());}}};
mEditFirstName.setOnFocusChangeListener(onFocusChangeListener);mEditLastName.setOnFocusChangeListener(onFocusChangeListener);

这对我有好处!

类似于@Anh Duy的回答,但它不适合我。我还需要光标移动到最后,只有当用户点击编辑文本时,之后仍然能够选择光标的位置,这是唯一适合我的代码

boolean textFocus = false; //define somewhere globally in the class
//in onFinishInflate() or somewhereeditText.setOnTouchListener(new OnTouchListener() {@Overridepublic boolean onTouch(View v, MotionEvent event) {
editText.onTouchEvent(event);
if(!textFocus) {editText.setSelection(editText.getText().length());textFocus = true;}
return true;}});
editText.setOnFocusChangeListener(new OnFocusChangeListener() {@Overridepublic void onFocusChange(View v, boolean hasFocus) {textFocus = false;}});

这就是诀窍安全

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

如果您的EditText不清晰:

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

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

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

    android:selectAllOnFocus="true"

我测试过的所有其他代码都没有很好地工作,因为用户仍然可以将插入符号/光标放置在字符串中间的任何位置(例如:12|3.00-其中|是光标)。每当在EditText上发生触摸时,我的解决方案总是将光标放在字符串的末尾。

最终的解决方案是:

// For a EditText like:<EditTextandroid: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"/>

@string="0.00"@string/zero_value="0.00"

// Create a Static boolean flagprivate static boolean returnNext;

// Set caret/cursor to the end on focus changeEditTextAmount.setOnFocusChangeListener(new View.OnFocusChangeListener() {@Overridepublic void onFocusChange(View editText, boolean hasFocus) {if(hasFocus){((EditText) editText).setSelection(((EditText) editText).getText().length());}}});
// Create a touch listener and put caret to the end (no matter where the user touched in the middle of the string)EditTextAmount.setOnTouchListener(new View.OnTouchListener() {@Overridepublic boolean onTouch(View editText, MotionEvent event) {((EditText) editText).onTouchEvent(event);((EditText) editText).setSelection(((EditText) editText).getText().length());return true;}});

// Implement a Currency Mask with addTextChangedListenerEditTextAmount.addTextChangedListener(new TextWatcher() {@Overridepublic void onTextChanged(CharSequence s, int start, int before, int count) {String input = s.toString();String output = new String();String buffer = new String();String decimals = new String();String numbers = Integer.toString(Integer.parseInt(input.replaceAll("[^0-9]", "")));
if(returnNext){returnNext = false;return;}
returnNext = true;
if (numbers.equals("0")){output += "0.00";}else if (numbers.length() <= 2){output += "0." + String.format("%02d", Integer.parseInt(numbers));}else if(numbers.length() >= 3){decimals = numbers.substring(numbers.length() - 2);int commaCounter = 0;for(int i=numbers.length()-3; i>=0; i--){if(commaCounter == 3){buffer += ",";commaCounter = 0;}buffer += numbers.charAt(i);commaCounter++;}output = new StringBuilder(buffer).reverse().toString() + "." + decimals;}EditTextAmount.setText(output);EditTextAmount.setSelection(EditTextAmount.getText().length());}
@Overridepublic void beforeTextChanged(CharSequence s, int start, int count, int after) {/*String input = s.toString();if(input.equals("0.0")){EditTextAmount.setText("0.00");EditTextAmount.setSelection(EditTextAmount.getText().length());return;}*/}
@Overridepublic void afterTextChanged(Editable s) {
}});

希望有帮助!

这招管用

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

静态编程语言

将光标设置为起始位置

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

将光标设置为EditText的结束

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

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

val editText = findViewById(R.id.edittext_id) as EditTexteditText.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);
public class CustomEditText extends EditText {public CustomEditText(Context context, AttributeSet attrs) {super(context, attrs);}
public CustomEditText(Context context) {super(context);}
public CustomEditText(Context context, AttributeSet attrs, int defStyle) {super(context, attrs, defStyle);}

@Overrideprotected void onFocusChanged(boolean focused, int direction, Rect previouslyFocusedRect) {super.onFocusChanged(focused, direction, previouslyFocusedRect);this.setSelection(this.getText().length());}
@Overrideprotected void onSelectionChanged(int selStart, int selEnd) {
}}

在您的XML文件中使用此CustomEditText,这将起作用。我已经测试过了,它正在为我工作。

editText.setSelection是这里的魔法。基本上,选择可以让您将光标放在您想要的任何位置。

EditText editText = findViewById(R.id.editText);editText.setSelection(editText.getText().length());

这将光标放在EditText的末尾。基本上editText.getText().length()为您提供文本长度。然后您使用带长度的setSelection

editText.setSelection(0);

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

输入图片描述

你好试试这个

 <EditTextandroid:id="@+id/edt_text"android:layout_width="match_parent"android:layout_height="wrap_content"android:text="Hello World!"android:cursorVisible="true"/>

editText=findViewById(R.id.edit文本);editText.set选择(editText.getText(). long()); // 结束点游标

这个问题很老,已经回答过了,但我认为如果您想使用新发布的适用于Android的数据绑定工具,得到这个答案可能会很有用,只需在您的XML中设置它:

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

在我的例子中,我创建了以下kotlin extp。函数,可能对某人有用

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

然后使用如下

mEditText.focus()

如果要将光标放在EditText视图中的文本末尾

 EditText rename;String title = "title_goes_here";int counts = (int) title.length();rename.setSelection(counts);rename.setText(title);
etSSID.setSelection(etSSID.getText().length());

对于ViewModel、LiveData和数据绑定

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

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

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

视图模型

private var accessedPosition: Boolean = false
val cursorPosition = MediatorLiveData<Event<Int>>().apply {addSource(yourObject) { value ->if(!accessedPosition) {setValue(Event(yourObject.note.length))accessedPosition = true}}}

这里,yourObject是从数据库中检索的另一个LiveData,该数据库包含您在EditText中显示的String文本。

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

xml

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

<!-- android:text must be placed before cursorPosition otherwise we'll get IndexOutOfBounds exception--><EditTextandroid:text="@={viewModel.noteText}"cursorPosition="@{viewModel.cursorPosition}" />

绑定适配器

@BindingAdapter("cursorPosition")fun bindCursorPosition(editText: EditText, event: Event<Int>?) {event?.getContentIfNotHandled()?.let { editText.setSelection(it) }}

Event

这里的Event类就像Google的Jose Alcérreca编写的单活事件列表。我在这里使用它来处理屏幕旋转。使用单个Event将确保当用户在中间的某个地方编辑文本并且屏幕旋转时,光标不会跳到文本末尾。当屏幕旋转时,它将保持相同的位置。

这是Event类:

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

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

上述答案对我不起作用。所以我找到了一个新的解决方案。这可能对某人有帮助。我一直在使用最新版本的Android Studio,即目前为止的3.5。也许这可能是上述答案没有显示任何效果的原因。

代码:

EditText available_seats = findViewById(R.id.available_seats);Selection.setSelection(available_seats.getText(),available_seats.getText().length());

在这里,第一个参数是您要使用的Spannable文本值,而第二个参数是索引值。由于我们希望光标位于文本末尾,因此我们采用getText(). long()返回文本的长度

editText.accessibilityDelegate = object : View.AccessibilityDelegate() {override fun sendAccessibilityEvent(host: View?, eventType: Int) {super.sendAccessibilityEvent(host, eventType)if (eventType == TYPE_VIEW_TEXT_SELECTION_CHANGED) {editText.setSelection(editText.length())}}}

完整的工作解决方案!!!

Kotlin,您需要使用post

fun EditText.placeCursorToEnd() {this.setOnFocusChangeListener { v, hasFocus ->if (hasFocus) {v.post { this.setSelection(text.length) }}}this.setOnClickListener {it.post { this.setSelection(text.length) }}}