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); }

38voto

shobhan Punkte 1370
public void setKeyboardVisibility(boolean show) {
    InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
    if(show){
        imm.toggleSoftInput(InputMethodManager.SHOW_FORCED, 0);
    }else{
        imm.hideSoftInputFromWindow(getCurrentFocus().getWindowToken(),0);
    }
}

36voto

gmk57 Punkte 679

Jetzt, fast 12 Jahre später, haben wir endlich eine offizielle, abwärtskompatible Möglichkeit, dies zu tun mit AndroidX Core 1.5+ :

fun View.hideKeyboard() = ViewCompat.getWindowInsetsController(this)
    ?.hide(WindowInsetsCompat.Type.ime())

oder speziell für Fragment:

fun Fragment.hideKeyboard() = ViewCompat.getWindowInsetsController(requireView())
    ?.hide(WindowInsetsCompat.Type.ime())

8 Stimmen

Sieh dir das mal an! Natürlich musste noch eine weitere API her (Fenstereinsatz-Controller vs. Eingabemethoden-Manager), aber hey, zumindest das Wort "ausblenden" ist da.

1 Stimmen

Wenn Sie die Tastatur ausblenden möchten, aber nur einen Verweis auf die Aktivität haben, welche Ansicht sollten Sie dann verwenden? window.decorView ? Vorher erhielten Sie das windowToken mit currentFocus?.windowToken und verwenden Sie dann InputMethodManager.hideSoftInputFromWindow(windowToken, 0)

1 Stimmen

@Mark, gute Frage! Der Test zeigt, dass window.decorView funktioniert nicht bei API 25-29: ViewCompat.getWindowInsetsController() gibt zurück. null . currentFocus hat ein ähnliches Problem bei API 30. Sie können jedoch eine beliebige Ansicht in Ihrem Layout verwenden, z. B. die Wurzelansicht. Um die Tastatur auszublenden, funktioniert es, aber um die Tastatur einzublenden, sind Sie vielleicht besser dran mit einer EditText : WindowInsetsControllerCompat.show() verwendet es, um den Fokus anzufordern.

33voto

Luke Sleeman Punkte 1616

Ich habe mehr als zwei Tage damit verbracht, alle in diesem Thread geposteten Lösungen durchzuarbeiten und habe festgestellt, dass sie in der einen oder anderen Weise unzureichend sind. Meine genaue Anforderung ist es, eine Schaltfläche zu haben, die mit 100% Zuverlässigkeit die Bildschirmtastatur ein- oder ausblendet. Wenn die Tastatur ausgeblendet ist, sollte sie nicht wieder erscheinen, unabhängig davon, auf welche Eingabefelder der Benutzer klickt. Im sichtbaren Zustand sollte die Tastatur nicht verschwinden, egal auf welche Tasten der Benutzer klickt. Dies muss auf Android 2.2+ bis hin zu den neuesten Geräten funktionieren.

Sie können eine funktionierende Implementierung dieses Verfahrens in meiner Anwendung sehen sauberes RPN .

Nachdem ich viele der vorgeschlagenen Antworten auf einer Reihe verschiedener Telefone (einschließlich Froyo- und Gingerbread-Geräte) getestet hatte, wurde deutlich, dass Android-Apps zuverlässig funktionieren:

  1. Blenden Sie die Tastatur vorübergehend aus. Sie wird wieder eingeblendet, wenn ein Benutzer ein neues Textfeld fokussiert.
  2. Anzeigen der Tastatur bei Beginn einer Aktivität und ein Kennzeichen für die Aktivität setzen, das angibt, dass die Tastatur immer sichtbar sein soll. Diese Markierung kann nur gesetzt werden, wenn eine Aktivität initialisiert wird.
  3. Markieren Sie eine Aktivität, die die Verwendung der Tastatur. Dieses Kennzeichen kann nur gesetzt werden, wenn eine Aktivität initialisiert wird.

Für mich reicht es nicht aus, die Tastatur vorübergehend auszublenden. Auf einigen Geräten wird sie wieder angezeigt, sobald ein neues Textfeld fokussiert wird. Da meine Anwendung mehrere Textfelder auf einer Seite verwendet, führt das Fokussieren eines neuen Textfeldes dazu, dass die ausgeblendete Tastatur wieder auftaucht.

Leider funktionieren die Punkte 2 und 3 der Liste nur zuverlässig, wenn eine Aktivität gestartet wird. Wenn die Aktivität erst einmal sichtbar geworden ist, können Sie die Tastatur nicht dauerhaft ein- oder ausblenden. Der Trick besteht darin, die Aktivität tatsächlich neu zu starten, wenn der Benutzer die Schaltfläche zum Umschalten der Tastatur drückt. In meiner Anwendung wird der folgende Code ausgeführt, wenn der Benutzer auf die Schaltfläche zum Umschalten der Tastatur drückt:

private void toggleKeyboard(){

    if(keypadPager.getVisibility() == View.VISIBLE){
        Intent i = new Intent(this, MainActivity.class);
        i.addFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION);
        Bundle state = new Bundle();
        onSaveInstanceState(state);
        state.putBoolean(SHOW_KEYBOARD, true);
        i.putExtras(state);

        startActivity(i);
    }
    else{
        Intent i = new Intent(this, MainActivity.class);
        i.addFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION);
        Bundle state = new Bundle();
        onSaveInstanceState(state);
        state.putBoolean(SHOW_KEYBOARD, false);
        i.putExtras(state);

        startActivity(i);
    }
}

Dies bewirkt, dass der Zustand der aktuellen Aktivität in einem Bundle gespeichert wird, und dann wird die Aktivität gestartet, wobei ein boolescher Wert übergeben wird, der angibt, ob die Tastatur angezeigt oder ausgeblendet werden soll.

Innerhalb der onCreate-Methode wird der folgende Code ausgeführt:

if(bundle.getBoolean(SHOW_KEYBOARD)){
    ((InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE)).showSoftInput(newEquationText,0);
    getWindow().setSoftInputMode(LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);
}
else{
    getWindow().setFlags(WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM,
            WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM);
}

Wenn die Soft-Tastatur angezeigt werden soll, dann wird der InputMethodManager angewiesen, die Tastatur anzuzeigen, und das Fenster wird angewiesen, die Soft-Eingabe immer sichtbar zu machen. Wenn die Soft-Tastatur ausgeblendet werden soll, wird das WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM gesetzt.

Dieser Ansatz funktioniert zuverlässig auf allen Geräten, die ich getestet habe - von einem 4 Jahre alten HTC-Handy mit Android 2.2 bis zu einem Nexus 7 mit 4.2.2. Der einzige Nachteil bei diesem Ansatz ist, dass man vorsichtig mit der Zurück-Taste umgehen muss. Da meine App im Wesentlichen nur einen Bildschirm hat (es ist ein Taschenrechner) kann ich onBackPressed() überschreiben und zum Home-Bildschirm des Geräts zurückkehren.

2 Stimmen

Ausgeklügelter Workaround, aber ich denke, es ist einfach zu viel, tausende von Objekten neu zu erstellen, nur um die Tastatur zu verstecken. Ich weiß nicht, wer die IMM für Android entworfen hat, aber es riecht nach einer Windows APi. Meiner Meinung nach sollte eine gute IME zwei Methoden haben: Ausblenden und Einblenden :-)

1 Stimmen

Das ist alles wahr, aber meine Lösung hat einen Vorteil - sie funktioniert immer! Es gibt keine andere Lösung, die ich finden konnte, die immer die Tastatur umschalten würde, unabhängig davon, welche Felder in der Benutzeroberfläche den Fokus haben, was der Benutzer getan hat, um die Tastatur umzuschalten und welche Android-Version er benutzt :-\

0 Stimmen

Mann, ich bin total verzweifelt und will die Tastatur verstecken. Habe schon tausende von Dingen ausprobiert und keines funktioniert. Aber dein Workaround ist mir zu viel, ich müsste etwa 10 Fragmente neu erstellen, Dienste initialisieren, eine Menge WeakReferences löschen .... du weißt schon... die GC würde einfach so 25mb wegwerfen :S ... Ich suche immer noch nach einer zuverlässigen Methode :(

31voto

Saran Punkte 3787

Alternativ zu diese Rundumlösung wenn Sie die Softtastatur schließen möchten von überall ohne einen Verweis auf das (EditText)-Feld zu haben, das zum Öffnen der Tastatur verwendet wurde, es aber trotzdem tun wollte, wenn das Feld fokussiert war, könnten Sie dies (von einer Aktivität aus) verwenden:

if (getCurrentFocus() != null) {
    InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
    imm.hideSoftInputFromWindow(getCurrentFocus().getWindowToken(), 0);
}

26voto

ban-geoengineering Punkte 17222

Dank an diese SO-Antwort habe ich folgendes abgeleitet, das in meinem Fall gut funktioniert, wenn ich durch die Fragmente eines ViewPagers blättere...

private void hideKeyboard() {   
    // Check if no view has focus:
    View view = this.getCurrentFocus();
    if (view != null) {
        InputMethodManager inputManager = (InputMethodManager) this.getSystemService(Context.INPUT_METHOD_SERVICE);
        inputManager.hideSoftInputFromWindow(view.getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS);
    }
}

private void showKeyboard() {   
    // Check if no view has focus:
    View view = this.getCurrentFocus();
    if (view != null) {
        InputMethodManager inputManager = (InputMethodManager) this.getSystemService(Context.INPUT_METHOD_SERVICE);
        inputManager.showSoftInput(view, InputMethodManager.SHOW_IMPLICIT);
    }
}

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