4350 Stimmen

Wie kann man die Android-Softtastatur programmgesteuert schließen/ausblenden?

Ich habe eine EditText und eine Button in meinem Layout.

Nachdem Sie in das Eingabefeld geschrieben und auf die Schaltfläche Button Ich möchte die virtuelle Tastatur ausblenden, wenn ich außerhalb der Tastatur berühre. Ich nehme an, dass dies ein einfaches Stück Code ist, aber wo kann ich ein Beispiel dafür finden?

19 Stimmen

Was ist, wenn Sie nur einen EditText und mehrere Schaltflächen, wie Kontrollkästchen und Radios, haben? Der einzige Ort, an dem Sie die Tastatur benötigen, ist der einzelne EditText. Wie registrieren Sie, dass etwas anderes gewählt/angeklickt wurde, um die Tastatur auszublenden?

19 Stimmen

Ich komme mir dumm vor. Ich bin nicht in der Lage, die Tastatur auf ICS zu verstecken. Habe alle Methoden hier und Kombinationen von ihnen versucht. Keine Chance. Die Methode, um es zu zeigen, funktioniert, aber ich kann es nicht verstecken, egal, was windw Token, verstecken Flaggen, manifestieren Einstellungen oder Kerzen zu jedem Heiligen. Auf der Tastatur zeigen, sehe ich immer diese: I/LatinIME( 396): InputType.TYPE_NULL ist angegeben W/LatinIME( 396): Unerwartete Eingabeklasse: inputType=0x00000000 imeOptions=0x00000000

5 Stimmen

/** * Diese Methode wird verwendet, um die Soft-Tastatur auszublenden. * @param activity */ public void hideSoftKeyboard(Activity activity) { InputMethodManager inputMethodManager = (InputMethodManager)activity.getSystemService(Activity.INPUT_METHOD_SERVICE); inputMethodManager.hideSoftInputFromWindow(activity.getCurrentFocus().getWindowToken(), 0); }

4711voto

Reto Meier Punkte 95825

Sie können Android zwingen, die virtuelle Tastatur auszublenden, indem Sie die Option InputMethodManager , Aufruf hideSoftInputFromWindow und übergibt dabei das Token des Fensters, das die fokussierte Ansicht enthält.

// 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 ausgeblendet. In einigen Fällen werden Sie in InputMethodManager.HIDE_IMPLICIT_ONLY als zweiten Parameter ein, um sicherzustellen, dass die Tastatur nur dann ausgeblendet wird, wenn der Benutzer sie nicht ausdrücklich erzwungen hat (indem er das Menü gedrückt hält).

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

Kotlin-Syntax

// Only runs if there is a view that is currently focused
this.currentFocus?.let { view ->
    val imm = getSystemService(Context.INPUT_METHOD_SERVICE) as? InputMethodManager
    imm?.hideSoftInputFromWindow(view.windowToken, 0)
}

2 Stimmen

Jetzt getSystemService() erfordert eine Context und eine Dienstklasse Class . Für den Kontext kann ich aufrufen requiredContext aber was ist mit der ServiceClass?

1 Stimmen

@capo11 Ich habe es mit Application.Context.getSystemService() versucht, so dass ich die serviceClass nicht benötigte, aber es funktioniert nicht.

2571voto

rmirabelle Punkte 5550

Um diesen Wahnsinn aufzuklären, möchte ich mich zunächst im Namen aller Android-Nutzer für Googles geradezu lächerliche Behandlung der weichen Tastatur entschuldigen. Der Grund, warum es so viele verschiedene Antworten auf dieselbe einfache Frage gibt, ist, dass diese API, wie viele andere in Android, schrecklich konzipiert ist. Mir fällt kein höflicher Weg ein, dies zu sagen.

Ich möchte die Tastatur verstecken. Ich erwarte, dass ich Android mit der folgenden Anweisung versorge: Keyboard.hide() . Das Ende. Ich danke Ihnen sehr. Aber Android hat ein Problem. Sie müssen die InputMethodManager um die Tastatur auszublenden. OK, gut, das ist die API von Android für die Tastatur. ABER! Sie benötigen eine Context um Zugang zur IMM zu erhalten. Jetzt haben wir ein Problem. Vielleicht möchte ich die Tastatur vor einer statischen oder Utility-Klasse verstecken, die keine Verwendung oder Notwendigkeit für eine Context . oder, was noch viel schlimmer ist, die IMM verlangt, dass Sie angeben, was View (oder noch schlimmer, was Window ), aus dem Sie die Tastatur ausblenden möchten.

Das macht das Verstecken der Tastatur so schwierig. Liebes Google: Wenn ich nach dem Rezept für einen Kuchen suche, gibt es keine RecipeProvider auf der Welt, die sich weigern würde, mir das Rezept zu geben, wenn ich nicht zuerst beantworte, WER den Kuchen essen wird UND wo er gegessen wird!!!

Diese traurige Geschichte endet mit der hässlichen Wahrheit: Um die Android-Tastatur zu verstecken, müssen Sie zwei Ausweise vorlegen: einen Context und entweder eine View oder eine Window .

Ich habe eine statische Dienstprogramm-Methode erstellt, die die Aufgabe SEHR solide erledigen kann, vorausgesetzt, Sie rufen sie von einer 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 Utility-Methode NUR funktioniert, wenn sie von einer Activity ! Die obige Methode ruft getCurrentFocus des Ziels Activity um das richtige Fenster-Token zu holen.

Aber nehmen wir an, Sie möchten die Tastatur vor einem EditText beherbergt in einer DialogFragment ? Die obige Methode ist dafür nicht geeignet:

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

Dies wird nicht funktionieren, da Sie einen Verweis auf die Fragment Der Gastgeber Activity die keine gezielte Kontrolle haben, während die Fragment wird gezeigt! Wahnsinn! Um also die Tastatur vor Fragmenten zu verstecken, 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);
}

Nachfolgend finden Sie einige zusätzliche Informationen, die ich nach längerer Suche nach dieser Lösung gesammelt habe:

Über windowSoftInputMode

Es gibt noch einen weiteren Streitpunkt, der zu beachten ist. Standardmäßig weist Android den anfänglichen Fokus automatisch dem ersten EditText oder fokussierbare Steuerung in Ihrem Activity . Daraus folgt natürlich, dass die InputMethod (in der Regel die Soft-Tastatur) auf das Fokus-Ereignis reagiert, indem sie sich selbst anzeigt. Die windowSoftInputMode Attribut in AndroidManifest.xml wenn sie auf stateAlwaysHidden weist die Tastatur an, diesen automatisch zugewiesenen anfänglichen Fokus zu ignorieren.

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

Es ist kaum zu glauben, aber es scheint nicht zu verhindern, dass sich die Tastatur öffnet, wenn Sie das Steuerelement berühren (außer focusable="false" und/oder focusableInTouchMode="false" der Steuerung zugewiesen sind). Offenbar gilt die Einstellung windowSoftInputMode nur für automatische Fokusereignisse, nicht für Fokusereignisse, die durch Berührungsereignisse ausgelöst werden.

Deshalb, stateAlwaysHidden ist in der Tat SEHR schlecht benannt. Er sollte vielleicht folgendermaßen heißen ignoreInitialFocus stattdessen.


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

Wenn es keine fokussierte Ansicht gibt (was z. B. passieren kann, wenn Sie gerade Fragmente gewechselt haben), gibt es andere Ansichten, die ein nützliches Window-Token liefern.

Dies sind Alternativen für den obigen Code if (view == null) view = new View(activity); Diese beziehen sich nicht ausdrücklich auf Ihre Tätigkeit.

Innerhalb einer Fragmentklasse:

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

Gegeben ein Fragment fragment als Parameter:

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

Ausgehend von Ihrem Textkörper:

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

UPDATE 2: Fokus löschen, um zu verhindern, dass die Tastatur erneut angezeigt wird, wenn Sie die App im Hintergrund öffnen

Fügen Sie diese Zeile an das Ende der Methode an:

view.clearFocus();

1 Stimmen

Warum brauchen getRootView() warum nicht getView() nur?

5 Stimmen

One liner: ((InputMethodManager)getContext().getSystemService(Activity.‌​INPUT_METHOD_SERVICE‌​)).hideSoftInputFrom‌​Window(getView().get‌​WindowToken(), 0);

1 Stimmen

Vor kurzem haben wir endlich eine offizielle, abwärtskompatible Möglichkeit um dies zu tun

855voto

Garnet Ulrich Punkte 3019

Auch zum Ausblenden der Softkey-Tastatur ist dies nützlich:

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

Dies kann verwendet werden, um das Soft-Keyboard zu unterdrücken, bis der Benutzer tatsächlich die editTextansicht berührt.

0 Stimmen

Das war die einzige, die 2020 funktioniert hat. Ich habe einen Text in der Hauptaktivität zu bearbeiten und möchte nicht, dass die Tastatur beim Starten der App angezeigt wird.

389voto

Saurabh Pareek Punkte 7036

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 passen HIDE_IMPLICIT_ONLY an der Stelle von showFlag y 0 an der Stelle von hiddenFlag . Die Tastatur wird mit Gewalt geschlossen.

6 Stimmen

Sie verwenden ein Ausblendungskennzeichen im Parameter showflags. Das funktioniert nur, weil die Konstanten dieselben Ganzzahlen verwenden. Beispiel für die Verwendung der richtigen Flaggen

0 Stimmen

Getestet auf Android 4.0, ich mag diese Lösung, weil ich mehrere Texte bearbeiten, Tasten auf dieser Aktivität, die den Fokus haben kann

0 Stimmen

Dies funktioniert für mich, ich habe keine Textfelder oder etwas, das wirklich Fokus hat.

170voto

mckoss Punkte 6444

Die Lösung von Meier funktioniert auch bei mir. In meinem Fall ist die oberste Ebene meiner App ein Tab-Host und ich möchte das Schlüsselwort beim Umschalten von Tabs ausblenden - ich erhalte das Fenster-Token von der Tab-Host-Ansicht.

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

0 Stimmen

Ich habe dies auch mit SearchView zum Laufen gebracht. Siehe unten für meine Antwort. Danke mckoss!

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X