Ich möchte ein Ereignis abfangen, wenn der Benutzer die Bearbeitung von EditText abgeschlossen hat.
Wie geht das?
android
android-edittext
Eddyuk
quelle
quelle
override fun afterTextChanged(s: Editable?) { if (s.toString().length == 5) { val enteredString = s.toString() }
Antworten:
Wenn der Benutzer die Bearbeitung abgeschlossen hat, drückt er
Done
oderEnter
quelle
Besser noch, Sie können auch den Listener EditText onFocusChange verwenden, um zu überprüfen, ob der Benutzer die Bearbeitung abgeschlossen hat: (Sie müssen sich nicht darauf verlassen, dass der Benutzer die Taste Fertig oder Eingabetaste auf der Softtastatur drückt. )
Hinweis: Für mehr als einen EditText können Sie auch Ihre Klasse implementieren lassen,
View.OnFocusChangeListener
dann die Listener auf jeden von Ihnen EditText setzen und sie wie folgt validierenquelle
EditText
. Es wird niemals den Fokus verlieren.EditText
? Muss ich verwendenonEditorAction
?EditText
, überprüfen Sie, was der Benutzer tut, um den Bildschirm zu verlassen.W/ViewRootImpl: Cancelling event due to no window focus: MotionEvent { action=ACTION_CANCEL, actionButton=0, id[0]=0, x[0]=605.52246, y[0]=969.4336, toolType[0]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=1, historySize=0, eventTime=238238, downTime=235422, deviceId=0, source=0x1002 }
Obwohl ich etwas eingegeben habe. Dies ist ein Edittext, der nur Zahlen akzeptiert.Ich persönlich bevorzuge die automatische Übermittlung nach dem Ende der Eingabe. So können Sie dieses Ereignis erkennen.
Erklärungen und Initialisierung:
Listener in zB onCreate ()
Wenn also der Text geändert wird, wartet der Timer auf die nächsten Änderungen. Wenn sie auftreten, wird der Timer abgebrochen und dann erneut gestartet.
quelle
Handler
stattdessenSie können dies mit setOnKeyListener oder mit einem textWatcher wie dem folgenden tun:
Stellen Sie den Textwächter ein
editText.addTextChangedListener(textWatcher);
Dann ruf an
quelle
Obwohl viele Antworten in die richtige Richtung weisen, denke ich, dass keine von ihnen antwortet, worüber der Autor der Frage nachgedacht hat. Zumindest habe ich die Frage anders verstanden, weil ich nach einer Antwort auf ein ähnliches Problem gesucht habe. Das Problem ist "Wie man erkennt, wann der Benutzer aufhört zu tippen, ohne dass er eine Taste drückt" und eine Aktion auslöst (z. B. automatische Vervollständigung). Wenn Sie dies tun möchten, starten Sie den Timer in onTextChanged mit einer Verzögerung, von der Sie annehmen würden, dass der Benutzer die Eingabe beendet hat (z. B. 500-700 ms), und brechen Sie für jeden neuen Buchstaben beim Starten des Timers den früheren ab (oder verwenden Sie zumindest eine Art von kennzeichnen, dass sie nichts tun, wenn sie ankreuzen). Hier ist ein ähnlicher Code wie der, den ich verwendet habe:
Beachten Sie, dass ich das laufende boolesche Flag in meiner asynchronen Task ändere (Task ruft den JSON vom Server zur automatischen Vervollständigung ab).
Denken Sie auch daran, dass dies viele Timer-Aufgaben erzeugt (ich denke, sie sind auf demselben Thread geplant, aber Sie müssten dies überprüfen), sodass es wahrscheinlich viele Verbesserungsmöglichkeiten gibt, aber dieser Ansatz funktioniert auch und unter dem Strich sollten Sie dies tun Verwenden Sie einen Timer, da kein Ereignis "Benutzer hat die Eingabe beendet" angezeigt wird.
quelle
@Reno und @Vinayak B antworten zusammen, wenn Sie die Tastatur nach der Aktion ausblenden möchten
quelle
Ein anderer Ansatz ... hier ein Beispiel: Wenn der Benutzer beim Tippen eine Verzögerung von 600-1000 ms hat, können Sie davon ausgehen, dass er gestoppt ist.
quelle
Okay, das wird sicher zu 100% funktionieren.
Zuerst müssen Sie den Listener einrichten, wenn die Tastatur ein- oder ausgeblendet ist. Wenn die Tastatur angezeigt wird, tippt der Benutzer wahrscheinlich, andernfalls wird die Eingabe abgeschlossen.
quelle
heightDiff > 100
Zeug ist beängstigend imho.Ich habe dieses Problem auf diese Weise gelöst. Ich habe Kotlin benutzt.
quelle
Ich hatte das gleiche Problem und wollte mich nicht darauf verlassen, dass der Benutzer Fertig oder Eingabetaste drückt.
Mein erster Versuch war, den onFocusChange-Listener zu verwenden, aber es kam vor, dass mein EditText standardmäßig den Fokus erhielt. Wenn der Benutzer eine andere Ansicht drückte, wurde der onFocusChange ausgelöst, ohne dass der Benutzer ihm jemals den Fokus zugewiesen hatte.
Die nächste Lösung hat es für mich getan, bei der onFocusChange angehängt wird, wenn der Benutzer den EditText berührt hat:
In meinem Fall wurde der Bildschirm nach dem Bearbeiten des Benutzers erneut gerendert, wodurch das myEditText-Objekt erneuert wurde. Wenn dasselbe Objekt beibehalten wird, sollten Sie wahrscheinlich den onFocusChange-Listener in onFocusChange entfernen, um das zu Beginn dieses Beitrags beschriebene onFocusChange-Problem zu vermeiden.
quelle
Ich hatte das gleiche Problem beim Versuch, "Jetzt tippen" in der Chat-App zu implementieren. Versuchen Sie, EditText wie folgt zu erweitern:
}}
quelle
Ich beendete sie mit dem gleichen Problem und konnte die Lösung nicht mit onEditorAction oder onFocusChange verwenden und wollte den Timer nicht ausprobieren. Ein Timer ist zu gefährlich für den Geschmack, wegen all der Threads und zu unvorhersehbar, da Sie nicht wissen, wann Ihr Code ausgeführt wird.
Die onEditorAction wird nicht abgefangen, wenn der Benutzer ohne Verwendung einer Schaltfläche abreist. Wenn Sie sie verwenden, beachten Sie bitte, dass KeyEvent null sein kann. Der Fokus ist an beiden Enden unzuverlässig. Der Benutzer kann den Fokus erhalten und verlassen, ohne Text einzugeben oder das Feld auszuwählen, und der Benutzer muss das letzte EditText-Feld nicht verlassen.
Meine Lösung verwendet onFocusChange und ein Flag, das gesetzt wird, wenn der Benutzer mit der Bearbeitung von Text beginnt, sowie eine Funktion, um den Text aus der letzten fokussierten Ansicht abzurufen, die ich bei Bedarf aufrufe.
Ich lösche nur den Fokus auf alle meine Textfelder, um den Code für die Textansicht zu verlassen. Der clearFocus-Code wird nur ausgeführt, wenn das Feld den Fokus hat. Ich rufe die Funktion in onSaveInstanceState auf, damit ich das Flag (mEditing) nicht als Status der EditText-Ansicht speichern muss und wenn auf wichtige Schaltflächen geklickt wird und wenn die Aktivität geschlossen wird.
Seien Sie vorsichtig mit TexWatcher, da es häufig aufgerufen wird. Ich verwende die Bedingung auf Fokus, um nicht zu reagieren, wenn der onRestoreInstanceState-Code Text eingibt. ich
quelle
Ich habe so etwas wie diese abstrakte Klasse gemacht, die anstelle des TextView.OnEditorActionListener-Typs verwendet werden kann.
quelle
Einfach auszulösen, um die Eingabe in EditText zu beenden
hat bei mir funktioniert, wenn du Java verwendest, konvertiere es
In Kotlin
quelle