Ich ändere den Wert eines EditText
auf keyListener
.
Aber wenn ich den Text ändere, bewegt sich der Cursor an den Anfang von EditText
. Der Cursor muss sich am Ende des Textes befinden.
So bewegen Sie den Cursor an das Ende des Textes in a EditText
.
EditText
s als Artikel von aListView
. Zum Experimentieren habe ich einige Änderungen amListView
Quellcode selbst vorgenommen, der ein ziemlich komplexes Tier ist, und am Emulator getestet. Es bezog sich auf das von der Komponente vorgenommene Fokussteuerungsmanagement. Natürlich ist es keine Lösung, die ich geben könnte, um unserem Freund zu helfen. :)OnFocusChanged
Rückrufs. Die Lösung besteht darin, setSelection in eine ausführbare Datei einzufügen und auf dem Hauptthread auszuführen. Überprüfen Sie hier stackoverflow.com/a/32156989/4514796Antworten:
Versuche dies:
quelle
onSelectionChanged()
Methode einerEditText
Klasse überschreibe :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()); return; } } super.onSelectionChanged(start, end); }
Es gibt eine Funktion namens append for ediitext, die den Zeichenfolgenwert an den aktuellen edittext-Wert anfügt und den Cursor am Ende des Werts platziert. Sie können den Zeichenfolgenwert als aktuellen Ediitext-Wert selbst festlegen und append () aufrufen.
quelle
myedittext.append("");
myedittext.append("");
hat bei mir nicht funktioniert!Selection
ist der richtige Weg, um diese IMO zu erreichen.Kotlin :
Stellen Sie den Cursor auf die Startposition :
Setzen Sie den Cursor auf das Ende des EditText :
Unter Code befindet sich der Cursor nach dem zweiten Zeichen:
JAVA :
Stellen Sie den Cursor auf die Startposition :
Setzen Sie den Cursor auf das Ende des EditText :
Unter Code befindet sich der Cursor nach dem zweiten Zeichen:
quelle
findViewById(R.id.edittext_id) as EditText
mitfindViewById<EditText>(R.id.edittext_id)
oder einfach nur das Gießen vermeiden , wenn mitAPI 26+
Wenn Sie
setText
zuvor angerufen haben und der neue Text keinen LayoutphasenaufrufsetSelection
in einer separatenView.post(Runnable)
ausführbaren Datei erhalten hat, die von ausgelöst wurde (Repost von diesem Thema).Also, für mich funktioniert dieser Code:
Edit 16.05.2019: Im Moment verwende ich dafür die Kotlin-Erweiterung:
und dann - editText.placeCursorToEnd ().
quelle
Sie können den Cursor auch wie folgt am Ende des Textes in der
EditText
Ansicht platzieren:quelle
quelle
Dies ist eine weitere mögliche Lösung:
Probieren Sie diese Lösung einfach aus, wenn sie aus irgendeinem Grund nicht funktioniert:
quelle
Es funktioniert gut für mich!
quelle
In meinem Fall habe ich das folgende Kotlin ext erstellt. Funktion, kann für jemanden nützlich sein
Dann wie folgt verwenden
quelle
Wenn Ihr EditText nicht klar ist:
oder
quelle
Sie sollten dies mit Hilfe der
EditText's
Methode erreichen könnensetSelection()
, siehe hierquelle
Ich denke, das kann erreichen, was Sie wollen.
quelle
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. Legen Sie dies einfach in Ihrem XML fest:
quelle
EditText editText = findViewById(R.id.editText); editText.setSelection(editText.getText().length()); // End point
Mauszeigerquelle
Wenn Sie den gesamten Text auswählen und nur neuen Text anstelle des alten eingeben möchten, können Sie verwenden
quelle
Das funktioniert
quelle
editText.setSelection
ist die Magie hier. Grundsätzlich können Sie mit der Auswahl den Cursor an einer beliebigen Position platzieren.Dadurch wird der Cursor an das Ende von EditText gesetzt. Grundsätzlich
editText.getText().length()
gibt Ihnen Textlänge. Dann benutzt dusetSelection
mit Länge.editText.setSelection(0);
Hiermit wird der Cursor auf die Startposition (0) gesetzt.
quelle
Alle anderen Codes, die ich getestet habe, funktionierten nicht gut, da der Benutzer das Caret / den Cursor immer noch 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:
@ string / amount = "0.00" @ string / zero_value = "0.00"
Ich hoffe es hilft!
quelle
Für ViewModel, LiveData und Datenbindung
Ich brauchte diese Funktionalität für die
EditText
mehrzeilige Unterstützung in meiner Notizen-App. Ich wollte den Cursor am Ende des Textes, wenn der Benutzer zu dem Fragment navigiert, das Notiztext enthält.Die vom Djleop vorgeschlagene Lösung kommt nahe. Das Problem dabei ist jedoch, dass, wenn der Benutzer den Cursor zum Bearbeiten irgendwo in die Mitte des Textes setzt und mit der Eingabe beginnt, der Cursor wieder zum Ende des Texts springt. Dies geschah, weil die
LiveData
neue Wert ausgegeben wurde und der Cursor erneut zum Ende des Textes sprang, was dazu führte, dass der Benutzer den Text nicht irgendwo in der Mitte bearbeiten konnte.Um dies zu lösen, benutze ich
MediatorLiveData
die Länge und weise sieString
nur einmal mit einem Flag zu. Dadurch lesen die LiveData den Wert nur einmal, dh wenn der Benutzer zum Fragment navigiert. Danach kann der Benutzer den Cursor an einer beliebigen Stelle platzieren, an der er den Text dort bearbeiten möchte.ViewModel
Hier
yourObject
ist eine weitere LiveData, die aus der Datenbank abgerufen wurde und den String-Text enthält, den Sie in der Datenbank anzeigenEditText
.Binden Sie dies
MediatorLiveData
dann mit dem Bindungsadapter an Ihren EditText.XML
Verwendet die bidirektionale Datenbindung zum Anzeigen von Text sowie zum Akzeptieren der Texteingabe.
Bindungsadapter
Event
KlasseDie
Event
Klasse hier ist wie ein SingleLiveEvent, das von Jose Alcérreca von Google geschrieben wurde. Ich benutze es hier, um mich um die Bildschirmrotation zu kümmern. Durch die Verwendung der SingleEvent
wird sichergestellt, dass der Cursor nicht zum Ende des Texts springt, wenn der Benutzer den Text irgendwo in der Mitte bearbeitet und sich der Bildschirm dreht. Es behält die gleiche Position bei, wenn sich der Bildschirm dreht.Hier ist die
Event
Klasse:Dies ist die Lösung, die für mich funktioniert und eine gute Benutzererfahrung bietet. Hoffe, es hilft auch in Ihren Projekten.
quelle
ähnlich wie @Anh Duys Antwort, aber es hat bei mir nicht funktioniert. Ich brauchte auch den Cursor, um nur dann zum Ende zu gelangen, wenn der Benutzer auf den Bearbeitungstext tippt und danach noch die Position des Cursors auswählen kann. Dies ist der einzige Code, der für mich funktioniert hat
quelle
Dies macht den Trick sicher :
quelle
quelle
Die obigen Antworten haben bei mir nicht funktioniert. Also habe ich eine neue Lösung gefunden. Das ist vielleicht hilfreich für jemanden. Ich habe die neueste Version von Android Studio verwendet, dh 3.5 zum aktuellen Datum. Vielleicht war dies der Grund, warum die obigen Antworten keine Wirkung zeigten.
CODE:
Hier ist das erste Argument der Spannable-Textwert, mit dem Sie spielen möchten, während das zweite Argument der Indexwert ist. Da der Cursor am Ende des Textes stehen soll, haben wir getText (). Length () verwendet, das die Länge des Textes zurückgibt
quelle
Verwenden Sie diesen CustomEditText in Ihrer XML-Datei. Dies funktioniert. Ich habe das getestet und es funktioniert für mich.
quelle
Wenn Sie den Cursor in der EditText-Ansicht am Ende des Texts platzieren möchten
quelle