Mein Layout enthält ListView
, SurfaceView
und EditText
. Wenn ich auf das klicke EditText
, wird der Fokus angezeigt und die Bildschirmtastatur wird angezeigt. Wenn ich irgendwo außerhalb von klicke EditText
, hat es immer noch den Fokus (sollte es nicht). Ich denke, ich könnte OnTouchListener
die anderen Ansichten im Layout einrichten und den EditText
Fokus manuell löschen . Scheint aber zu hackisch ...
Ich habe auch die gleiche Situation in der anderen Layout-Listenansicht mit verschiedenen Arten von Elementen, von denen einige EditText
darin enthalten sind. Sie verhalten sich so, wie ich es oben geschrieben habe.
Die Aufgabe besteht darin, EditText
den Fokus zu verlieren, wenn der Benutzer etwas außerhalb davon berührt.
Ich habe hier ähnliche Fragen gesehen, aber keine Lösung gefunden ...
quelle
hideSoftInputFromWindow()
Aufbauend auf Kens Antwort finden Sie hier die modularste Lösung zum Kopieren und Einfügen.
Kein XML erforderlich.
Fügen Sie es in Ihre Aktivität ein und es gilt für alle EditTexts, einschließlich derjenigen innerhalb von Fragmenten innerhalb dieser Aktivität.
quelle
MotionEvent.ACTION_DOWN
umMotionEvent.ACTION_UP
auf Ihrem Code. Tolle Antwort übrigens!Für die übergeordnete Ansicht des EditText, lassen Sie die folgenden drei Attribute „werden wahr “:
anklickbare , fokussierbar , focusableInTouchMode .
Wenn eine Ansicht den Fokus erhalten möchte, muss sie diese drei Bedingungen erfüllen.
Siehe android.view :
Ich hoffe es hilft.
quelle
(clickable) *OR* (focusable *AND* focusableInTouchMode)
;)Fügen Sie diese Eigenschaften einfach in die oberste übergeordnete Eigenschaft ein.
quelle
Kens Antwort funktioniert, aber es ist hacky. Wie pcans im Kommentar der Antwort anspielt, könnte dasselbe mit dispatchTouchEvent geschehen. Diese Lösung ist sauberer, da das XML nicht mit einem transparenten Dummy-FrameLayout gehackt werden muss. So sieht das aus:
quelle
Für mich unten haben die Dinge funktioniert -
1. Hinzufügen
android:clickable="true"
undandroid:focusableInTouchMode="true"
zumparentLayout
vonEditText
dhandroid.support.design.widget.TextInputLayout
2. Überschreiben der
dispatchTouchEvent
Aktivitätsklasse und Einfügen derhideKeyboard()
Funktion3. Hinzufügen
setOnFocusChangeListener
für EditTextquelle
Sie haben wahrscheinlich bereits die Antwort auf dieses Problem gefunden, aber ich habe nach einer Lösung gesucht und kann immer noch nicht genau das finden, wonach ich gesucht habe. Deshalb dachte ich, ich würde es hier posten.
Was ich getan habe, war das Folgende (dies ist sehr verallgemeinert, der Zweck ist es, Ihnen eine Vorstellung davon zu geben, wie Sie vorgehen sollen. Das Kopieren und Einfügen des gesamten Codes funktioniert nicht O: D):
Lassen Sie zuerst den EditText und alle anderen Ansichten, die Sie in Ihrem Programm haben möchten, von einer einzelnen Ansicht umschließen. In meinem Fall habe ich ein LinearLayout verwendet, um alles zu verpacken.
Dann müssen Sie in Ihrem Code einen Touch Listener für Ihr Haupt-LinearLayout festlegen.
Ich hoffe das hilft einigen Leuten. Oder hilft ihnen zumindest, ihr Problem zu lösen.
quelle
Definieren Sie einfach zwei Eigenschaften des übergeordneten Elements
EditText
als:Wenn der Benutzer außerhalb des
EditText
Bereichs berührt , wird der Fokus entfernt, da der Fokus auf die übergeordnete Ansicht übertragen wird.quelle
Ich habe eine
ListView
Reihe vonEditText
Ansichten. Das Szenario besagt, dass wir nach dem Bearbeiten von Text in einer oder mehreren Zeilen auf eine Schaltfläche namens "Fertig stellen" klicken sollten. Ich habeonFocusChanged
dieEditText
Ansicht innerhalb von verwendet,listView
aber nach dem Klicken auf Fertig stellen werden die Daten nicht gespeichert. Das Problem wurde durch Hinzufügen gelöstinnerhalb der
onClickListener
Schaltfläche "Fertig stellen" und die Daten wurden erfolgreich gespeichert.quelle
Ich denke wirklich, dass es eine robustere Art ist
getLocationOnScreen
alsgetGlobalVisibleRect
. Weil ich auf ein Problem stoße. Es gibt eine Listenansicht, die Edittext enthält undajustpan
in der Aktivität festgelegt ist. Ich finde,getGlobalVisibleRect
dass ein Wert zurückgegeben wird, der so aussieht, als würde er das scrollY enthalten, aber das event.getRawY befindet sich immer auf dem Bildschirm. Der folgende Code funktioniert gut.quelle
Um den Fokus zu verlieren, wenn eine andere Ansicht berührt wird, sollten beide Ansichten als view.focusableInTouchMode (true) festgelegt werden.
Es scheint jedoch, dass die Verwendung von Fokussen im Touch-Modus nicht empfohlen wird. Bitte schauen Sie hier: http://android-developers.blogspot.com/2008/12/touch-mode.html
quelle
Am besten verwenden Sie die Standardmethode
clearFocus()
Sie wissen, wie man Codes
onTouchListener
richtig löst ?Rufen Sie einfach an
EditText.clearFocus()
. Es wird klar fokussieren inlast EditText
.quelle
Wie von @pcans vorgeschlagen, können Sie dies
dispatchTouchEvent(MotionEvent event)
in Ihrer Aktivität überschreiben .Hier erhalten wir die Berührungskoordinaten und vergleichen sie, um Grenzen anzuzeigen. Wenn die Berührung außerhalb einer Ansicht ausgeführt wird, tun Sie etwas.
Es ist auch nicht erforderlich, das Vorhandensein und die Sichtbarkeit von Ansichten zu überprüfen, wenn sich das Layout Ihrer Aktivität zur Laufzeit nicht ändert (z. B. fügen Sie keine Fragmente hinzu oder ersetzen / entfernen Ansichten aus dem Layout). Wenn Sie jedoch ein benutzerdefiniertes Kontextmenü schließen möchten (oder etwas Ähnliches tun möchten) (wie im Google Play Store, wenn Sie das Überlaufmenü des Elements verwenden), müssen Sie das Vorhandensein der Ansicht überprüfen. Andernfalls erhalten Sie eine
NullPointerException
.quelle
Dieser einfache Codeausschnitt macht, was Sie wollen
quelle
In Kotlin
hidekeyboard () ist eine Kotlin-Erweiterung
Fügen Sie in der Aktivität dispatchTouchEvent hinzu
Fügen Sie diese Eigenschaften im obersten übergeordneten Element hinzu
quelle
Dies ist meine Version, die auf dem Code von zMan basiert. Die Tastatur wird nicht ausgeblendet, wenn die nächste Ansicht auch ein Bearbeitungstext ist. Die Tastatur wird auch nicht ausgeblendet, wenn der Benutzer nur den Bildschirm scrollt.
quelle