Frage Schließen / verstecken Sie die Android-Soft-Tastatur


ich habe ein EditText und ein Button in meinem Layout.

Nach dem Schreiben in das Eingabefeld und Klick auf den ButtonIch möchte die virtuelle Tastatur verstecken. Ich nehme an, dass dies ein einfacher Code ist, aber wo finde ich ein Beispiel dafür?


3085


Ursprung


Antworten:


Um diesen Wahnsinn zu verdeutlichen, möchte ich mich im Namen aller Android-Nutzer für die geradezu lächerliche Behandlung der weichen Tastatur durch Google entschuldigen. Der Grund, warum es so viele Antworten gibt, jede für die gleiche einfache Frage, ist, weil diese API, wie viele andere in Android, entsetzlich gestaltet ist. Ich kann mir keine höfliche Art vorstellen, es zu sagen.

Ich möchte die Tastatur verstecken. Ich erwarte, Android mit der folgenden Aussage zu versehen: Keyboard.hide(). Das Ende. Vielen Dank. Aber Android hat ein Problem. Sie müssen das verwenden InputMethodManager um die Tastatur zu verstecken. OK, gut, das ist Androids API auf der Tastatur. ABER! Sie müssen eine haben Context um Zugang zum IMM zu bekommen. Jetzt haben wir ein Problem. Ich möchte vielleicht die Tastatur aus einer statischen oder Dienstprogramm-Klasse verstecken, die für keine oder keine Verwendung hat Context. oder Und noch schlimmer, das IMM erfordert, dass Sie was angeben View (oder noch schlimmer, was Window) Sie möchten die Tastatur von FROM verbergen.

Das macht das Ausblenden der Tastatur so schwierig. Lieber Google: Wenn ich nach dem Rezept für einen Kuchen suche, gibt es keinen RecipeProvider auf der Erde, die sich weigern würde, mich mit dem Rezept zu versorgen, es sei denn, ich antworte zuerst WHO, der Kuchen wird von gegessen UND wo wird es gegessen werden !!

Diese traurige Geschichte endet mit der hässlichen Wahrheit: Um die Android-Tastatur zu verstecken, müssen Sie zwei Arten der Identifizierung angeben: a Context und entweder a View oder ein Window.

Ich habe eine statische Hilfsmethode erstellt, die die Arbeit SEHR stabil erledigt, vorausgesetzt, Sie rufen es von einem an Activity.

public static void hideKeyboard(Activity activity) {
    InputMethodManager imm = (InputMethodManager) activity.getSystemService(Activity.INPUT_METHOD_SERVICE);
    //Find the currently focused view, so we can grab the correct window token from it.
    View view = activity.getCurrentFocus();
    //If no view currently has focus, create a new one, just so we can grab a window token from it
    if (view == null) {
        view = new View(activity);
    }
    imm.hideSoftInputFromWindow(view.getWindowToken(), 0);
}

Beachten Sie, dass diese Dienstprogrammmethode NUR funktioniert, wenn sie von einem aufgerufen wird Activity! Die obige Methode ruft auf getCurrentFocus des Ziels Activity um das richtige Fenster-Token zu holen.

Aber nehmen wir an, Sie möchten die Tastatur vor einem verstecken EditText gehostet in einem DialogFragment? Sie können die obige Methode nicht dafür verwenden:

hideKeyboard(getActivity()); //won't work

Dies wird nicht funktionieren, da Sie eine Referenz an die Fragmentder Gastgeber Activity, die keine fokussierte Kontrolle haben wird, während die Fragment wird gezeigt! Beeindruckend! Um also die Tastatur vor Fragmenten zu verbergen, greife ich auf die niedrigere, häufigere und hässlichere Ebene zurück:

public static void hideKeyboardFrom(Context context, View view) {
    InputMethodManager imm = (InputMethodManager) context.getSystemService(Activity.INPUT_METHOD_SERVICE);
    imm.hideSoftInputFromWindow(view.getWindowToken(), 0);
}

Im Folgenden finden Sie einige zusätzliche Informationen, die sich aus der Zeit ergeben, die mit der Verfolgung dieser Lösung verschwendet wurde:

Über windowSoftInputMode

Es gibt noch einen weiteren Streitpunkt, der beachtet werden muss. Standardmäßig weist Android den ersten Fokus automatisch dem ersten zu EditText oder fokussierbare Kontrolle in Ihrem Activity. Daraus folgt natürlich, dass InputMethod (normalerweise die Soft-Tastatur) auf das Fokus-Ereignis reagiert, indem es sich selbst zeigt. Das windowSoftInputMode Attribut in AndroidManifest.xml, wenn auf eingestellt stateAlwaysHidden, weist die Tastatur an, diesen automatisch zugewiesenen anfänglichen Fokus zu ignorieren.

<activity
    android:name=".MyActivity"
    android:windowSoftInputMode="stateAlwaysHidden"/>

Fast unglaublich scheint es nichts zu tun, um zu verhindern, dass sich die Tastatur öffnet, wenn Sie das Steuerelement berühren (außer focusable="false" und / oder focusableInTouchMode="false" sind der Steuerung zugeordnet). Offenbar gilt die Einstellung windowSoftInputMode nur für automatische Fokusereignisse, nicht um Ereignisse zu fokussieren, die von Berührungsereignissen ausgelöst werden.

Deshalb, stateAlwaysHidden ist wirklich sehr schlecht benannt. Es sollte vielleicht genannt werden ignoreInitialFocus stattdessen.

Hoffe das hilft.


UPDATE: Weitere Möglichkeiten, ein Fenster-Token zu erhalten

Wenn es keine fokussierte Ansicht gibt (z. B. kann dies passieren, wenn Sie nur Fragmente geändert haben), gibt es andere Ansichten, die ein nützliches Fenstertoken liefern.

Dies sind Alternativen für den obigen Code if (view == null) view = new View(activity);  Diese beziehen sich nicht explizit auf Ihre Aktivität.

Innerhalb einer Fragmentklasse:

view = getView().getRootView().getWindowToken();

Gegeben ein Fragment fragment als ein Parameter:

view = fragment.getView().getRootView().getWindowToken();

Ausgehend von Ihrem Inhaltskörper:

view = findViewById(android.R.id.content).getRootView().getWindowToken();

UPDATE 2: Deaktivieren Sie den Fokus, um zu vermeiden, dass die Tastatur erneut angezeigt wird, wenn Sie die App aus dem Hintergrund öffnen

Fügen Sie diese Zeile am Ende der Methode hinzu:

view.clearFocus();


1008



Sie können Android zwingen, die virtuelle Tastatur mit der Taste zu verbergen InputMethodManagerRufen hideSoftInputFromWindow, übergibt das Token des Fensters mit Ihrer fokussierten Ansicht.

// Check if no view has focus:
View view = this.getCurrentFocus();
if (view != null) {  
    InputMethodManager imm = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);
    imm.hideSoftInputFromWindow(view.getWindowToken(), 0);
}

Dadurch wird die Tastatur in allen Situationen versteckt. In einigen Fällen werden Sie gerne vorbeikommen InputMethodManager.HIDE_IMPLICIT_ONLY als zweiten Parameter, um sicherzustellen, dass Sie die Tastatur nur dann ausblenden, wenn der Benutzer sie nicht explizit erzwungen hat (indem Sie das Menü gedrückt halten).

Hinweis: Wenn Sie dies in Kotlin tun möchten, verwenden Sie: context?.getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager


4171



Zum Verbergen der Soft-Tastatur ist auch nützlich:

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

Dies kann verwendet werden, um die Soft-Tastatur zu unterdrücken, bis der Benutzer tatsächlich die editText-Ansicht berührt.


741



Ich habe eine weitere Lösung, um die Tastatur zu verstecken:

InputMethodManager imm = (InputMethodManager) getSystemService(Activity.INPUT_METHOD_SERVICE);
imm.toggleSoftInput(InputMethodManager.HIDE_IMPLICIT_ONLY, 0);

Hier vorbei HIDE_IMPLICIT_ONLY an der Position von showFlag und 0 an der Position von hiddenFlag. Es schließt die Soft-Tastatur mit Gewalt.


294



Meiers Lösung funktioniert auch für mich. In meinem Fall ist die oberste Ebene meiner App ein TabHost und ich möchte das Schlüsselwort beim Wechseln der Tabs ausblenden - ich erhalte das Fenster-Token von der TabHost-Ansicht.

tabHost.setOnTabChangedListener(new OnTabChangeListener() {
    public void onTabChanged(String tabId) {
        InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
        imm.hideSoftInputFromWindow(tabHost.getApplicationWindowToken(), 0);
    }
}

128



Bitte versuchen Sie dies unter dem Code in onCreate()

EditText edtView=(EditText)findViewById(R.id.editTextConvertValue);
edtView.setInputType(0);

115



Aktualisieren: Ich weiß nicht, warum diese Lösung nicht mehr funktioniert (ich habe es gerade auf Android 23 getestet). Bitte verwenden Sie die Lösung von Saurabh Pareek stattdessen. Hier ist es:

InputMethodManager imm = (InputMethodManager) getSystemService(Activity.INPUT_METHOD_SERVICE);
//Hide:
imm.toggleSoftInput(InputMethodManager.HIDE_IMPLICIT_ONLY, 0);
//Show
imm.toggleSoftInput(InputMethodManager.SHOW_IMPLICIT, 0);

Alte Antwort:

//Show soft-keyboard:
getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);
//hide keyboard :
 getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN);

107



protected void hideSoftKeyboard(EditText input) {
    input.setInputType(0);
    InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
    imm.hideSoftInputFromWindow(input.getWindowToken(), 0);    
}

63



Wenn alle anderen Antworten hier nicht so funktionieren, wie Sie es möchten, gibt es eine andere Möglichkeit, die Tastatur manuell zu steuern.

Erstellen Sie eine Funktion mit der einige der EditTextEigenschaften:

public void setEditTextFocus(boolean isFocused) {
    searchEditText.setCursorVisible(isFocused);
    searchEditText.setFocusable(isFocused);
    searchEditText.setFocusableInTouchMode(isFocused);

    if (isFocused) {
        searchEditText.requestFocus();
    }
}

Stellen Sie dann sicher, dass onFocus der EditText Sie öffnen / schließen die Tastatur:

searchEditText.setOnFocusChangeListener(new OnFocusChangeListener() {
    @Override
    public void onFocusChange(View v, boolean hasFocus) {
        if (v == searchEditText) {
            if (hasFocus) {
                // Open keyboard
                ((InputMethodManager) context.getSystemService(Context.INPUT_METHOD_SERVICE)).showSoftInput(searchEditText, InputMethodManager.SHOW_FORCED);
            } else {
                // Close keyboard
                ((InputMethodManager) context.getSystemService(Context.INPUT_METHOD_SERVICE)).hideSoftInputFromWindow(searchEditText.getWindowToken(), 0);
            }
        }
    }
});

Wann immer Sie die Tastatur manuell öffnen möchten, rufen Sie Folgendes auf:

setEditTextFocus(true);

Und für das Schließen des Anrufs:

setEditTextFocus(false);

58