Schließen Sie die virtuelle Tastatur beim Drücken der Taste


133

Ich habe eine Activitymit einem EditText, einem Knopf und einem ListView. Der Zweck besteht darin, einen Suchbildschirm in das EditTextFeld einzugeben, die Taste zu drücken und die Suchergebnisse in diese Liste aufzunehmen.

Das alles funktioniert perfekt, aber die virtuelle Tastatur verhält sich seltsam.

Wenn ich auf klicke EditText, erhalte ich die virtuelle Tastatur. Wenn ich auf der virtuellen Tastatur auf die Schaltfläche "Fertig" klicke, wird sie ausgeblendet. Wenn ich jedoch auf meine Suchschaltfläche klicke, bevor ich auf der virtuellen Tastatur auf "Fertig" klicke, bleibt die virtuelle Tastatur erhalten und ich kann sie nicht entfernen. Durch Klicken auf die Schaltfläche "Fertig" wird die Tastatur nicht geschlossen. Es ändert die Schaltfläche "Fertig" von "Fertig" in einen Pfeil und bleibt sichtbar.

Danke für Ihre Hilfe

Antworten:


304
InputMethodManager inputManager = (InputMethodManager)
                                  getSystemService(Context.INPUT_METHOD_SERVICE); 

inputManager.hideSoftInputFromWindow(getCurrentFocus().getWindowToken(),
                                     InputMethodManager.HIDE_NOT_ALWAYS);

Ich habe das gleich nach der onClick(View v)Veranstaltung gemacht.

Sie müssen importieren android.view.inputmethod.InputMethodManager;

Die Tastatur wird ausgeblendet, wenn Sie auf die Schaltfläche klicken.


55
Hinweis: (falls Sie diese Methode in Fällen verwenden möchten, in denen möglicherweise kein Fokus vorhanden ist (z. B. onPause () usw.): inputManager.hideSoftInputFromWindow((null == getCurrentFocus()) ? null : getCurrentFocus().getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS);
Peter Ajtai

5
Sie müssen auch Context importieren.
Si8

4
VORSICHT: Wirft NPE, wenn die Tastatur bereits ausgeblendet ist. Folgen Sie Peters Kommentar, um dies zu vermeiden.
Don Larynx

Warum wird die Tastatur nach einem Klick auf eine irrelevante Schaltfläche angezeigt? Kann jemand eine Erklärung oder einen Link geben?
kommradHomer

1
Funktioniert wie Charme!
ARiF

59
mMyTextView.setOnEditorActionListener(new TextView.OnEditorActionListener() {
    public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
        if (actionId == EditorInfo.IME_ACTION_SEARCH) {
            // hide virtual keyboard
            InputMethodManager imm = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);
            imm.hideSoftInputFromWindow(m_txtSearchText.getWindowToken(), 
                                      InputMethodManager.RESULT_UNCHANGED_SHOWN);
            return true;
        }
        return false;
    }
});

Für mich geht das. Vielen Dank!
Aman Goyal

29

Verwenden Sie den folgenden Code

your_button_id.setOnClickListener(new OnClickListener() {
    @Override
    public void onClick(View v) {
        try  {
            InputMethodManager imm = (InputMethodManager)getSystemService(INPUT_METHOD_SERVICE);
            imm.hideSoftInputFromWindow(getCurrentFocus().getWindowToken(), 0);
        } catch (Exception e) {

        }
    }
});

2
Ausnahme statt einfacher Nullprüfung, ernsthaft?!
Dr. Glass


einfache Lösung für das, was ich brauchte: Tastatur ausblenden, nachdem ich auf die Schaltfläche Suchen geklickt habe.
Dawoodman71

13

Sie sollten OnEditorActionListenerfür Ihre EditView implementieren

public void performClickOnDone(EditView editView, final View button){
    textView.setOnEditorActionListener(new OnEditorActionListener() {

        @Override
        public boolean onEditorAction(EditView v, int actionId, KeyEvent event) {
            hideKeyboard();
            button.requestFocus();
            button.performClick();
            return true;
        }
    });

Und Sie verstecken die Tastatur durch:

public void hideKeybord(View view) {
    inputMethodManager.hideSoftInputFromWindow(view.getWindowToken(),
                                  InputMethodManager.RESULT_UNCHANGED_SHOWN);
}

Sie sollten auch die Tastatur auslösen, die sich in Ihrer Schaltfläche versteckt onClickListener

Wenn Sie nun auf der virtuellen Tastatur und der Schaltfläche auf "Fertig" klicken, wird das Gleiche getan - die Tastatur ausblenden und die Klickaktion ausführen.


Ausgezeichnet, aber ich folge nicht ganz. Ich denke, der Beitrag hat einen Teil des Codes gefressen (in Ihrem Beispiel gibt es nichts nach "public void"). Ich habe versucht, setOnEditorActionListner in der onCreate-Methode meiner Aktivität festzulegen, weiß jedoch nicht, was setOnEditorActionListener ist. Ich erhalte eine Benachrichtigung "Anonymer innerer Typ". (Ich mache dies in meiner Activity onCreate-Methode) i37.tinypic.com/6ozkig.png
Andrew

1
Es sieht so aus, als ob dieser Code einige Fehler enthält, aber es ist die richtige Idee. Zum einen ist die OnEditorActionListener-Schnittstelle eine innere Klasse, daher müssen Sie sie entweder explizit importieren (Eclipse erledigt dies in diesem Fall nicht für Sie) oder als bezeichnen TextView.OnEditorActionListener.
MatrixFrog

Ich habe ein bisschen Ärger. Ich habe onEditorActionListener implementiert (öffentliche Klasse SearchActivity erweitert ListActivity implementiert OnClickListener, OnEditorActionListener). Ich habe einen Listener an meinen EditText (mSearchText.setOnEditorActionListener (this);) angehängt, aber Eclipse erlaubt mir nicht, den onEditorA onAditorA zu überschreiben (TextView v, int actionId, KeyEvent-Ereignis)). Es heißt, es muss eine Superklassenmethode überschreiben. Irgendwelche Ideen?
Andrew

Hallo, Sie können Ihren OnEditorActionListener inline setzen, indem Sie Ihren EditView.setOnEditorActionListener (neuer OnEditorActionListener () {....
Pixel

11

Fügen Sie den folgenden Code in Ihr Button-Click-Ereignis ein:

InputMethodManager inputManager = (InputMethodManager) getSystemService(this.INPUT_METHOD_SERVICE);
inputManager.hideSoftInputFromWindow(getCurrentFocus().getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS);

1
Funktioniert wie Charme!
Coderpc

10

Da Sie nur einen Bearbeitungstext haben, rufen Sie einfach die Aktion auf, die für diesen Bearbeitungstext in Ihrem Schaltflächenklick ausgeführt wurde, und der Rest wird vom System erledigt. Wenn Sie mehr als einen Edittext hätten, wäre dies nicht so effizient, da Sie zuerst den fokussierten Edittext erhalten müssen. Aber in Ihrem Fall wird es perfekt funktionieren

myedittext.onEditorAction(EditorInfo.IME_ACTION_DONE)

1
Können Sie eine Erklärung hinterlassen, warum Ihre Lösung funktioniert, damit andere sie verstehen und daraus lernen können? Vielen Dank!
Shawn

Sicher Shawn. Ich habe gerade das Top bearbeitet, da ich neu im Posieren bin, wenn es nicht klar ist, lass es mich wissen und ich werde es mit dem Button onclick erweitern
Laert

Glauben Sie mir, dies ist eine der elegantesten Möglichkeiten, dies zu tun. Danke @Laert
WitVault

9

Für Aktivität,

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

Verwenden Sie für Fragmente getActivity ()

getActivity (). getSystemService ();

getActivity (). getCurrentFocus ();

InputMethodManager imm = (InputMethodManager)getActivity().getSystemService(INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(getActivity().getCurrentFocus().getWindowToken(), 0);

7

Diese Lösung funktioniert perfekt für mich:

private void showKeyboard(EditText editText) {
    editText.requestFocus();
    editText.setFocusableInTouchMode(true);
    InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
    imm.showSoftInput(editText, InputMethodManager.RESULT_UNCHANGED_SHOWN);
    editText.setSelection(editText.getText().length());
}

private void closeKeyboard() {
    InputMethodManager inputManager = (InputMethodManager) getApplicationContext().getSystemService(Context.INPUT_METHOD_SERVICE);
    inputManager.hideSoftInputFromWindow(this.getCurrentFocus().getWindowToken(), InputMethodManager.RESULT_UNCHANGED_SHOWN);
}

3

Versuche dies...

  1. Zum Anzeigen der Tastatur

    editText.requestFocus();
    InputMethodManager imm = (InputMethodManager) ctx.getSystemService(Context.INPUT_METHOD_SERVICE);
    imm.toggleSoftInput(InputMethodManager.SHOW_FORCED, 0);
  2. Zum Ausblenden der Tastatur

    InputMethodManager inputManager = (InputMethodManager) ctx.getSystemService(Context.INPUT_METHOD_SERVICE); 
    inputManager.toggleSoftInput(InputMethodManager.HIDE_IMPLICIT_ONLY, 0);

"Für Tastatur ausblenden" ist eine Google-Methode (ausblenden, wenn sichtbar, anzeigen, ob ausgeblendet ist), kein Ausblenden.
Ninja Coding

1
View view = this.getCurrentFocus();
if (view != null) {
InputMethodManager imm =(InputMethodManager)this.getSystemService(Context.INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(view.getWindowToken(), 0);enter code here}

Hallo! Obwohl diese Antwort den Anforderungen von @Andrew genügen könnte, wäre es großartig, wenn Sie sie mit einigen Erklärungen erweitern könnten, um sicherzustellen, dass zukünftige Leser in vollem Umfang davon profitieren können!
derM

1

Kotlin Beispiel:

val inputMethodManager = context.getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager

aus Fragment:

inputMethodManager.hideSoftInputFromWindow(activity?.currentFocus?.windowToken, InputMethodManager.HIDE_NOT_ALWAYS)

von Aktivität:

inputMethodManager.hideSoftInputFromWindow(currentFocus?.windowToken, InputMethodManager.HIDE_NOT_ALWAYS)

0

Sie verwenden diesen Code in Ihrem Button-Click-Ereignis

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

0

Crash Null Point Exception Fix: Ich hatte einen Fall, in dem die Tastatur möglicherweise nicht geöffnet werden konnte, wenn der Benutzer auf die Schaltfläche klickt. Sie müssen eine if-Anweisung schreiben, um zu überprüfen, ob getCurrentFocus () keine Null ist:

            InputMethodManager inputManager = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
        if(getCurrentFocus() != null) {
            inputManager.hideSoftInputFromWindow(getCurrentFocus().getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS);

-2

Wenn Sie einstellen android:singleLine="true", verbirgt die Taste automatisch die Tastatur.

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.