Ich ändere den Wert einer EditText
auf keyListener
.
Wenn ich jedoch den Text ändere, bewegt sich der Cursor an den Anfang der EditText
.
So bewegen Sie den Cursor in einer EditText
an das Ende des Textes.
Versuche dies:
EditText et = (EditText)findViewById(R.id.inbox);
et.setSelection(et.getText().length());
Es gibt eine Funktion namens append für ediitext, die den String-Wert an den aktuellen Edittext-Wert anfügt und den Cursor an das Ende des Werts setzt. Sie können den String-Wert als aktuellen Ediitext-Wert selbst festlegen und append () aufrufen.
myedittext.append("current_this_edittext_string");
Kotlin :
setzen Sie den Cursor auf die Startposition :
val editText = findViewById(R.id.edittext_id) as EditText
editText.setSelection(0)
setzen Sie den Cursor auf das Ende von EditText :
val editText = findViewById(R.id.edittext_id) as EditText
editText.setSelection(editText.getText().length())
Unter dem Code wird der Cursor nach dem zweiten Zeichen platziert:
val editText = findViewById(R.id.edittext_id) as EditText
editText.setSelection(2)
Java :
setzen Sie den Cursor auf die Startposition :
EditText editText = (EditText)findViewById(R.id.edittext_id);
editText.setSelection(0);
setzen Sie den Cursor auf das Ende von EditText :
EditText editText = (EditText)findViewById(R.id.edittext_id);
editText.setSelection(editText.getText().length());
Unter dem Code wird der Cursor nach dem zweiten Zeichen platziert:
EditText editText = (EditText)findViewById(R.id.edittext_id);
editText.setSelection(2);
Wenn Sie zuvor setText
aufgerufen haben und der neue Text die Layoutphase nicht aufgerufen hat, rufen Sie setSelection
in einer separaten ausführbaren Instanz auf, die von View.post(Runnable)
ausgelöst wird (erneute Veröffentlichung von this topic).
Also für mich funktioniert dieser Code:
editText.setText("text");
editText.post(new Runnable() {
@Override
public void run() {
registerPhone.setSelection("text".length());
}
});
Sie können den Cursor auch wie folgt in der EditText
-Ansicht am Ende des Textes platzieren:
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;
}
});
Dies ist eine weitere mögliche Lösung:
et.append("");
Probieren Sie diese Lösung einfach aus, wenn sie aus irgendeinem Grund nicht funktioniert:
et.setSelection(et.getText().length());
In meinem Fall habe ich folgendes Kotlin ext erstellt. Funktion kann für jemanden nützlich sein
private fun EditText.focus(){
requestFocus()
setSelection(length())
}
Dann wie folgt verwenden
mEditText.focus()
Sie sollten dies mit der Methode setSelection () der EditText-Methode erreichen können, siehe hier .
ich denke, das kann erreichen, was Sie wollen.
Editable etext = mSubjectTextEditor.getText();
Selection.setSelection(etext, etext.length());
/**
* 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);
Es funktioniert gut für mich!
Wenn Ihr EditText nicht klar ist:
editText.setText("");
editText.append("New text");
Die Frage ist alt und beantwortet, aber ich denke, es kann nützlich sein, diese Antwort zu haben, wenn Sie die neu veröffentlichten DataBinding-Tools für Android verwenden möchten. Setzen Sie dies einfach in Ihr XML:
<data>
<variable name="stringValue" type="String"/>
</data>
...
<EditText
...
Android:text="@={stringValue}"
Android:selection="@{stringValue.length()}"
...
/>
Hallo, versuche es
<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
Cursor
editText.setSelection
Ist hier die Magie. Grundsätzlich können Sie den Cursor an einer beliebigen Position platzieren.
EditText editText = findViewById(R.id.editText);
editText.setSelection(editText.getText().length());
Dies platziert den Cursor an das Ende von EditText. Grundsätzlich gibt editText.getText().length()
die Textlänge an. Dann verwenden Sie setSelection
mit der Länge.
editText.setSelection(0);
Hiermit setzen Sie den Cursor auf die Startposition (0).
Alle anderen Codes, die ich getestet habe, funktionierten nicht gut, da der Benutzer die Einfügemarke/Cursor an beliebiger Stelle in der Mitte der Zeichenfolge platzieren konnte (Beispiel: 12 | 3.00 - wobei | der Cursor ist). Meine Lösung setzt den Cursor immer am Ende der Zeichenfolge, wenn der EditText berührt wird.
Die ultimative Lösung ist:
// 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) {
}
});
Ich hoffe es hilft!
Das funktioniert
Editable etext = edittext.getText();
Selection.setSelection(etext,edittext.getText().toString().length());
Wenn Sie den gesamten Text auswählen und nur neuen statt alten Text eingeben möchten, können Sie verwenden
Android:selectAllOnFocus="true"
Das macht den Trick sicher :
editText.setText("");
if (!TextUtils.isEmpty(text)) {
editText.append(text);
}
Ähnlich wie @Anh Duys Antwort, aber es funktionierte nicht für mich. Ich brauchte auch den Cursor, um nur ans Ende zu gelangen, wenn der Benutzer auf den Bearbeitungstext tippt und anschließend noch die Position des Cursors auswählen kann. Dies ist der einzige Code, der für mich funktioniert hat
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;
}
});
etSSID.setSelection(etSSID.getText().length());
Wenn Sie den Cursor in der EditText-Ansicht am Ende des Texts platzieren möchten
EditText rename;
String title = "title_goes_here";
int counts = (int) title.length();
rename.setSelection(counts);
rename.setText(title);