Android Tastatur entlassen

147

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

Manikandan
quelle
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);
DeRagan
quelle
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);
    }
}
user2167877
quelle
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);
    }
}
U / min
quelle
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);
Kandha
quelle
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()
Marchy
quelle
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);
Andy
quelle
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();
    }
}
Androidmalin
quelle
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)
    }
}

Mahmoud Mabrok
quelle
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()
Masterwok
quelle