Android Tastatur entlassen


147

Wie entlasse ich die Tastatur, wenn eine Taste gedrückt wird?


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

InputMethodManager imm = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(myEditText.getWindowToken(), 0);

1
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:

private void hideSoftKeyBoard() {
    InputMethodManager imm = (InputMethodManager) getSystemService(INPUT_METHOD_SERVICE);

    if(imm.isAcceptingText()) { // verify if the soft keyboard is open                      
        imm.hideSoftInputFromWindow(getCurrentFocus().getWindowToken(), 0);
    }
}

3
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.
Georgie

29

Das ist meine Lösung

public static void hideKeyboard(Activity activity) {
    View v = activity.getWindow().getCurrentFocus();
    if (v != null) {
        InputMethodManager imm = (InputMethodManager) activity.getSystemService(Context.INPUT_METHOD_SERVICE);
        imm.hideSoftInputFromWindow(v.getWindowToken(), 0);
    }
}

Dies ist der Fall, wenn Sie die Ansicht kennen, durch die die Tastatur angezeigt wurde.
RPM

16

Sie können diesen Code auch für ein Klickereignis verwenden

getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_HIDDEN);

13

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 ) as InputMethodManager
    if( inputMethodManager.isAcceptingText )
        inputMethodManager.hideSoftInputFromWindow( this.currentFocus.windowToken, /*flags:*/ 0)
}

Dann konsumieren Sie einfach mit:

// from activity
this.dismissKeyboard()

// from fragment
activity.dismissKeyboard()

5

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:

    EditText myEditText= (EditText) findViewById(R.id.anyEditTextInForm);  
    InputMethodManager imm = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);
    imm.hideSoftInputFromWindow(myEditText.getWindowToken(), 0);

3
Willkommen bei Stack Overflow! Dies ist wirklich ein Kommentar, keine Antwort. Mit etwas mehr Wiederholungen können Sie Kommentare posten .
Jack

4
    public static void hideSoftInput(Activity activity) {
    try {
        if (activity == null || activity.isFinishing()) return;
        Window window = activity.getWindow();
        if (window == null) return;
        View view = window.getCurrentFocus();
        //give decorView a chance
        if (view == null) view = window.getDecorView();
        if (view == null) return;

        InputMethodManager imm = (InputMethodManager) activity.getApplicationContext().getSystemService(Context.INPUT_METHOD_SERVICE);
        if (imm == null || !imm.isActive()) return;
        imm.hideSoftInputFromWindow(view.getWindowToken(), 0);
    } catch (Throwable e) {
        e.printStackTrace();
    }
}

1

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) as InputMethodManager }
    val windowHeightMethod = InputMethodManager::class.java.getMethod("getInputMethodWindowVisibleHeight")
    val height = windowHeightMethod.invoke(imm) as Int
    if (height > 0) {
        imm.toggleSoftInput(InputMethodManager.HIDE_IMPLICIT_ONLY, 0)
    }
}


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) as InputMethodManager
}

/**
 * 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:

editTextFoo.dismiss()
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.