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

Andrew
quelle

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.

Paul Maserrat
quelle
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;
    }
});
Andrew
quelle
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) {

        }
    }
});
Prashant Maheshwari Andro
quelle
2
Ausnahme statt einfacher Nullprüfung, ernsthaft?!
Dr. Glass
Arbeitet
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.

Pixel
quelle
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);
Ashana.Jackol
quelle
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)
Laert
quelle
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);
Priya Rajan
quelle
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);
}
Giedrius Šlikas
quelle
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);
Affa Musaffa
quelle
"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}
Farruh Habibullaev
quelle
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)
norbDEV
quelle
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);
}
Pankaj Talaviya
quelle
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);
CacheMeOutside
quelle
-2

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

Terranologie
quelle