我正在更改EditText
on的值keyListener
。
但是当我更改文本时,光标移动到EditText
. 我需要光标位于文本的末尾。
如何将光标移动到EditText
.
我正在更改EditText
on的值keyListener
。
但是当我更改文本时,光标移动到EditText
. 我需要光标位于文本的末尾。
如何将光标移动到EditText
.
尝试这个:
更新:
科特林:
editText.setSelection(editText.length())//placing cursor at the end of the text
爪哇:
editText.setSelection(editText.getText().length());
有一个名为 append 的函数用于 ediitext,它将字符串值附加到当前的 edittext 值并将光标放在值的末尾。您可以将字符串值作为当前 ediitext 值本身并调用 append();
myedittext.append("current_this_edittext_string");
科特林:
将光标设置到起始位置:
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)
爪哇:
将光标设置到起始位置:
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);
如果您之前调用setText
过并且新文本没有在由(从本主题重新发布)setSelection
触发的单独可运行文件中获得布局阶段调用。View.post(Runnable)
所以,对我来说,这段代码有效:
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()。
您还可以将光标放在EditText
视图中文本的末尾,如下所示:
EditText et = (EditText)findViewById(R.id.textview);
int textLength = et.getText().length();
et.setSelection(textLength, textLength);
editText.setOnKeyListener(new View.OnKeyListener() {
@Override
public boolean onKey(View v, int keyCode, KeyEvent event) {
editText.setSelection(editText.getText().length());
return false;
}
});
这是另一种可能的解决方案:
et.append("");
如果由于任何原因不起作用,请尝试此解决方案:
et.setSelection(et.getText().length());
就我而言,我创建了以下 kotlin 分机。功能,可能对某人有用
private fun EditText.focus(){
requestFocus()
setSelection(length())
}
然后如下使用
mEditText.focus()
您应该能够在EditText's
方法的帮助下实现这一点setSelection()
,请参见此处
如果您的 EditText 不清楚:
editText.setText("");
editText.append("New text");
或者
editText.setText(null);
editText.append("New text");
/**
* 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);
它对我有用!
我认为这可以实现你想要的。
Editable etext = mSubjectTextEditor.getText();
Selection.setSelection(etext, etext.length());
这个问题已经过时了,但我认为如果你想使用新发布的 Android 数据绑定工具,得到这个答案可能会很有用,只需在你的 XML 中设置它:
<data>
<variable name="stringValue" type="String"/>
</data>
...
<EditText
...
android:text="@={stringValue}"
android:selection="@{stringValue.length()}"
...
/>
你好试试这个
<EditText
android:id="@+id/edt_text"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Hello World!"
android:cursorVisible="true"/>
EditText editText = findViewById(R.id.editText);
editText.setSelection(editText.getText().length()); // End point
光标
editText.setSelection
是这里的魔法。基本上,选择使您可以将光标放在您想要的任何位置。
EditText editText = findViewById(R.id.editText);
editText.setSelection(editText.getText().length());
这会将光标置于 EditText 的末尾。基本上editText.getText().length()
给你文本长度。然后你使用setSelection
长度。
editText.setSelection(0);
用于将光标设置在起始位置 (0)。
这有效
Editable etext = edittext.getText();
Selection.setSelection(etext,edittext.getText().toString().length());
如果您想选择所有文本并只输入新文本而不是旧文本,您可以使用
android:selectAllOnFocus="true"
我需要这个功能来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
.
然后MediatorLiveData
使用绑定适配器将此绑定到您的 EditText。
XML
使用双向数据绑定来显示文本以及接受文本输入。
<!-- android:text must be placed before cursorPosition otherwise we'll get IndexOutOfBounds exception-->
<EditText
android: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 编写的SingleLiveEvent 。我在这里用它来处理屏幕旋转。使用 singleEvent
将确保当用户在中间某处编辑文本并且屏幕旋转时,光标不会跳到文本的末尾。当屏幕旋转时,它将保持相同的位置。
这是Event
课程:
open class Event<out T>(private val content: T) {
var hasBeenHandled = false
private set // Allow external read but not write
/**
* Returns the content and prevents its use again.
*/
fun getContentIfNotHandled(): T? {
return if (hasBeenHandled) {
null
} else {
hasBeenHandled = true
content
}
}
/**
* Returns the content, even if it's already been handled.
*/
fun peekContent(): T = content
}
这是适合我并提供良好用户体验的解决方案。希望它对您的项目也有帮助。
我测试过的所有其他代码都不能正常工作,因为用户仍然可以将插入符号/光标放在字符串中间的任何位置(例如:12|3.00 - 其中 | 是光标)。每当在 EditText 上发生触摸时,我的解决方案总是将光标放在字符串的末尾。
最终的解决方案是:
// 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"/>
@string/amount="0.00" @string/zero_value="0.00"
// Create a Static boolean flag
private static boolean returnNext;
// Set caret/cursor to the end on focus change
EditTextAmount.setOnFocusChangeListener(new View.OnFocusChangeListener() {
@Override
public 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() {
@Override
public boolean onTouch(View editText, MotionEvent event) {
((EditText) editText).onTouchEvent(event);
((EditText) editText).setSelection(((EditText) editText).getText().length());
return true;
}
});
// Implement a Currency Mask with addTextChangedListener
EditTextAmount.addTextChangedListener(new TextWatcher() {
@Override
public 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());
}
@Override
public 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;
}*/
}
@Override
public void afterTextChanged(Editable s) {
}
});
希望能帮助到你!
类似于@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);
}
以上答案对我不起作用。所以我找到了一个新的解决方案。这可能对某人有帮助。截至目前,我一直在使用最新版本的 Android Studio 即 3.5。也许这可能是上述答案没有显示任何效果的原因。
代码:
EditText available_seats = findViewById(R.id.available_seats);
Selection.setSelection(available_seats.getText(),available_seats.getText().length());
在这里,第一个参数是您想要使用的 Spannable 文本值,而第二个参数是索引值。因为,我们希望光标在文本的末尾,所以我们使用 getText().length() 来返回文本的长度
etSSID.setSelection(etSSID.getText().length());
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);
}
@Override
protected void onFocusChanged(boolean focused, int direction, Rect previouslyFocusedRect) {
super.onFocusChanged(focused, direction, previouslyFocusedRect);
this.setSelection(this.getText().length());
}
@Override
protected void onSelectionChanged(int selStart, int selEnd) {
}
}
在您的 XML 文件中使用此 CustomEditText,这将起作用。我已经对此进行了测试,它对我有用。
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())
}
}
}
如果要将光标放在 EditText 视图中的文本末尾
EditText rename;
String title = "title_goes_here";
int counts = (int) title.length();
rename.setSelection(counts);
rename.setText(title);