Machen Sie einen EditText fokussierbar = Falsch erledigt den Job. Möchten Sie es vollständig deaktivieren?
st0le
Antworten:
325
Sie möchten eine virtuelle Tastatur deaktivieren oder schließen?
Wenn Sie es einfach schließen möchten, können Sie die folgenden Codezeilen in den Schaltflächen Ihrer Schaltfläche verwenden, wenn Sie auf Ereignis klicken
Zwei Probleme damit ... eines ist, dass myEditText endgültig sein muss. Zweitens muss ich wissen, welches EditText-Feld den Fokus hat. Irgendeine Lösung dafür?
Ethan Allen
78
Für alle anderen, die hier stolpern, können Sie die Aktivitäten (entweder die Aktivität, in der Sie sich befinden, oder die Fragmente getActivity()) getCurrentFocus().getWindowToken()für das erste Argument verwenden hideSoftInputFromWindow(). Tun Sie es auch im onPause()und nicht im, onStop()wenn Sie versuchen, es beim Ändern von Aktivitäten zum Verschwinden zu bringen.
Drake Clarris
2
Diese Antwort, kombiniert mit dem Kommentar hier oben, hat mein Problem völlig gelöst!
Aveschini
9
Was für ein hässlicher, hässlicher Ansatz, eine Tastatur zu verwerfen. Ich hoffe, dass es in Zukunft einen saubereren Weg gibt, so etwas Einfaches zu tun.
Subby
73
Die obige Lösung funktioniert nicht für alle Geräte und verwendet außerdem EditText als Parameter. Dies ist meine Lösung, nennen Sie einfach diese einfache Methode:
privatevoid hideSoftKeyBoard(){InputMethodManager imm =(InputMethodManager) getSystemService(INPUT_METHOD_SERVICE);if(imm.isAcceptingText()){// verify if the soft keyboard is open
imm.hideSoftInputFromWindow(getCurrentFocus().getWindowToken(),0);}}
isAcceptingText()machte diese Antwort besser als andere
user1506104
Gute Lösung ... in seltenen Fällen kann isAcceptingText () false zurückgeben, wenn sich die Tastatur noch auf dem Bildschirm befindet. Klicken Sie beispielsweise von EditText weg, um Text auszuwählen, der ausgewählt, aber nicht im selben Fenster bearbeitet werden kann.
Hier ist eine Kotlin-Lösung (Mischen der verschiedenen Antworten im Thread)
Erstellen Sie eine Erweiterungsfunktion (möglicherweise in einer allgemeinen ViewHelpers-Klasse).
fun Activity.dismissKeyboard(){
val inputMethodManager = getSystemService(Context.INPUT_METHOD_SERVICE )asInputMethodManagerif( inputMethodManager.isAcceptingText )
inputMethodManager.hideSoftInputFromWindow(this.currentFocus.windowToken,/*flags:*/0)}
Dann konsumieren Sie einfach mit:
// from activitythis.dismissKeyboard()// from fragment
activity.dismissKeyboard()
Die erste Lösung mit InputMethodManager funktionierte für mich wie ein Champion, die Methode getWindow (). SetSoftInputMode funktionierte nicht auf Android 4.0.3 HTC Amaze.
@Ethan Allen, ich musste den Bearbeitungstext nicht endgültig machen. Vielleicht verwenden Sie eine innere EditText-Klasse, die Sie als enthaltende Methode deklariert haben? Sie können den EditText zu einer Klassenvariablen der Aktivität machen. Oder deklarieren Sie einfach einen neuen EditText innerhalb der inneren Klasse / Methode und verwenden Sie findViewById () erneut. Außerdem musste ich nicht wissen, welcher EditText im Formular den Fokus hatte. Ich könnte einfach einen willkürlich auswählen und ihn verwenden. Wie so:
Diese Lösung stellt sicher, dass die Tastatur ausgeblendet ist und auch nichts tut, wenn sie nicht geöffnet wird. Es verwendet die Erweiterung, sodass es von jeder Context Owner-Klasse verwendet werden kann.
fun Context.dismissKeyboard(){
val imm by lazy {this.getSystemService(Context.INPUT_METHOD_SERVICE)asInputMethodManager}
val windowHeightMethod =InputMethodManager::class.java.getMethod("getInputMethodWindowVisibleHeight")
val height = windowHeightMethod.invoke(imm)asIntif(height >0){
imm.toggleSoftInput(InputMethodManager.HIDE_IMPLICIT_ONLY,0)}}
Durch Verwendung des Kontextes der Ansicht können wir mit den folgenden Erweiterungsmethoden in Kotlin das gewünschte Ergebnis erzielen:
/**
* Get the [InputMethodManager] using some [Context].
*/
fun Context.getInputMethodManager():InputMethodManager{if(Build.VERSION.SDK_INT >=Build.VERSION_CODES.M){return getSystemService(InputMethodManager::class.java)}return getSystemService(Context.INPUT_METHOD_SERVICE)asInputMethodManager}/**
* Dismiss soft input (keyboard) from the window using a [View] context.
*/
fun View.dismissKeyboard()= context
.getInputMethodManager().hideSoftInputFromWindow(
windowToken
,0)
Sobald diese vorhanden sind, rufen Sie einfach an:
Antworten:
Sie möchten eine virtuelle Tastatur deaktivieren oder schließen?
Wenn Sie es einfach schließen möchten, können Sie die folgenden Codezeilen in den Schaltflächen Ihrer Schaltfläche verwenden, wenn Sie auf Ereignis klicken
quelle
getActivity()
)getCurrentFocus().getWindowToken()
für das erste Argument verwendenhideSoftInputFromWindow()
. Tun Sie es auch imonPause()
und nicht im,onStop()
wenn Sie versuchen, es beim Ändern von Aktivitäten zum Verschwinden zu bringen.Die obige Lösung funktioniert nicht für alle Geräte und verwendet außerdem EditText als Parameter. Dies ist meine Lösung, nennen Sie einfach diese einfache Methode:
quelle
isAcceptingText()
machte diese Antwort besser als andereDas ist meine Lösung
quelle
Sie können diesen Code auch für ein Klickereignis verwenden
quelle
Hier ist eine Kotlin-Lösung (Mischen der verschiedenen Antworten im Thread)
Erstellen Sie eine Erweiterungsfunktion (möglicherweise in einer allgemeinen ViewHelpers-Klasse).
Dann konsumieren Sie einfach mit:
quelle
Die erste Lösung mit InputMethodManager funktionierte für mich wie ein Champion, die Methode getWindow (). SetSoftInputMode funktionierte nicht auf Android 4.0.3 HTC Amaze.
@Ethan Allen, ich musste den Bearbeitungstext nicht endgültig machen. Vielleicht verwenden Sie eine innere EditText-Klasse, die Sie als enthaltende Methode deklariert haben? Sie können den EditText zu einer Klassenvariablen der Aktivität machen. Oder deklarieren Sie einfach einen neuen EditText innerhalb der inneren Klasse / Methode und verwenden Sie findViewById () erneut. Außerdem musste ich nicht wissen, welcher EditText im Formular den Fokus hatte. Ich könnte einfach einen willkürlich auswählen und ihn verwenden. Wie so:
quelle
quelle
Diese Lösung stellt sicher, dass die Tastatur ausgeblendet ist und auch nichts tut, wenn sie nicht geöffnet wird. Es verwendet die Erweiterung, sodass es von jeder Context Owner-Klasse verwendet werden kann.
quelle
Durch Verwendung des Kontextes der Ansicht können wir mit den folgenden Erweiterungsmethoden in Kotlin das gewünschte Ergebnis erzielen:
Sobald diese vorhanden sind, rufen Sie einfach an:
quelle