Zamknij wirtualną klawiaturę po naciśnięciu przycisku


133

Mam Activityz EditText, przycisk i ListView. Celem jest wpisanie ekranu wyszukiwania w EditText, naciśnięcie przycisku, a wyniki wyszukiwania zapełnią tę listę.

To wszystko działa idealnie, ale klawiatura wirtualna zachowuje się dziwnie.

Jeśli kliknę EditText, otrzymam wirtualną klawiaturę. Jeśli kliknę przycisk „Gotowe” na wirtualnej klawiaturze, zniknie. Jeśli jednak kliknę przycisk wyszukiwania przed kliknięciem przycisku „Gotowe” na klawiaturze wirtualnej, klawiatura wirtualna pozostanie i nie mogę się jej pozbyć. Kliknięcie przycisku „Gotowe” nie zamyka klawiatury. Zmienia przycisk „Gotowe” z „Gotowe” na strzałkę i pozostaje widoczny.

Dzięki za pomoc

Odpowiedzi:


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

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

Umieściłem to zaraz po onClick(View v)wydarzeniu.

Musisz zaimportować android.view.inputmethod.InputMethodManager;

Klawiatura chowa się po kliknięciu przycisku.


55
Uwaga: (w przypadku, gdy chcesz użyć tej metody w przypadkach, w których może nie być fokusu (np. OnPause () itp.): inputManager.hideSoftInputFromWindow((null == getCurrentFocus()) ? null : getCurrentFocus().getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS);
Peter Ajtai,

5
Musisz także zaimportować Context.
Si8

4
UWAGA: zgłasza NPE, jeśli klawiatura jest już ukryta. Postępuj zgodnie z komentarzem Piotra, aby tego uniknąć.
Don Larynx

dlaczego klawiatura pojawia się po kliknięciu nieistotnego przycisku? czy ktoś może podać jakieś wyjaśnienie lub link?
kommradHomer

1
Działa jak urok!
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;
    }
});

Mi to pasuje. Dzięki!
Aman Goyal

29

Użyj poniższego kodu

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
Łapanie wyjątku zamiast prostego sprawdzania wartości zerowej, poważnie ?!
Dr Glass

Pracując dla mnie, ukrywa klawiaturę po kliknięciu przycisku
ashishdhiman2007

proste rozwiązanie tego, czego potrzebowałem: ukryj klawiaturę po kliknięciu przycisku wyszukiwania.
dawoodman71

13

Powinieneś zaimplementować OnEditorActionListenerdla swojego EditView

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

I ukrywasz klawiaturę przez:

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

Powinieneś także odpalić klawiaturę ukrywającą się w twoim przycisku za pomocą onClickListener

Teraz kliknięcie „Gotowe” na wirtualnej klawiaturze i przycisku zrobi to samo - ukryj klawiaturę i wykonaj kliknięcie.


Świetnie, ale nie do końca nadążam. Myślę, że post zjadł część kodu (w twojej próbce nie ma nic po "public void"). Próbowałem ustawićOnEditorActionListner w metodzie onCreate mojego działania, ale nie wiem, co to jest setOnEditorActionListener. Otrzymuję powiadomienie „Anonimowy typ wewnętrzny”. (Robię to w mojej metodzie Activity onCreate) i37.tinypic.com/6ozkig.png
Andrew

1
Wygląda na to, że w tym kodzie jest kilka błędów, ale to dobry pomysł. Po pierwsze, interfejs OnEditorActionListener jest klasą wewnętrzną, więc musisz go zaimportować jawnie (w tym przypadku Eclipse nie zrobi tego za Ciebie) lub odnieść się do niego jako TextView.OnEditorActionListener.
MatrixFrog

Mam trochę problemów. Zaimplementowałem onEditorActionListener (publiczna klasa SearchActivity rozszerza ListActivity implementuje OnClickListener, OnEditorActionListener), dołączyłem detektor do mojego EditText (mSearchText.setOnEditorActionListener (this);), ale Eclipse nie pozwoli mi na nadpisanie funkcji onEditorAction (TextView v, int actionId, zdarzenie KeyEvent)). Mówi, że musi przesłonić metodę nadklasy. Jakieś pomysły?
Andrew,

Cześć, możesz wstawić swój OnEditorActionListener, wpisując yourEditView.setOnEditorActionListener (nowy OnEditorActionListener () {....
piksel

11

Dodaj następujący kod do zdarzenia kliknięcia przycisku:

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

1
Działa jak urok!
coderpc

10

Ponieważ masz tylko jeden tekst edycji, po prostu wywołaj akcję wykonaną dla tego tekstu w kliknięciu przycisku, a reszta jest obsługiwana przez system. Gdybyś miał więcej niż jeden plik edittext, nie byłby to tak efektywny, ponieważ najpierw musisz pobrać skoncentrowany plik edittext. Ale w twoim przypadku zadziała idealnie

myedittext.onEditorAction(EditorInfo.IME_ACTION_DONE)

1
Czy możesz podać wyjaśnienie, dlaczego Twoje rozwiązanie działa, aby inni mogli je zrozumieć i uczyć się z niego? Dzięki!
Shawn

Jasne, Shawn. Właśnie zredagowałem górę, ponieważ jestem nowy w pozowaniu, jeśli nie jest to jasne, daj mi znać, a rozwinę za pomocą przycisku onclick
Laert

Uwierz mi, to jeden z najbardziej eleganckich sposobów na zrobienie tego. Dzięki @Laert
WitVault

9

Aktywność,

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

W przypadku fragmentów użyj metody getActivity ()

getActivity (). getSystemService ();

getActivity (), getCurrentFocus ();

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

7

U mnie to rozwiązanie działa idealnie:

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

Spróbuj tego...

  1. Do pokazania klawiatury

    editText.requestFocus();
    InputMethodManager imm = (InputMethodManager) ctx.getSystemService(Context.INPUT_METHOD_SERVICE);
    imm.toggleSoftInput(InputMethodManager.SHOW_FORCED, 0);
  2. Ukryj klawiaturę

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

Metoda „Ukryj klawiaturę” to Google (ukryj, jeśli jest widoczna, pokaż, jeśli jest ukryta), a nie ukryta,
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}

Cześć! Chociaż ta odpowiedź mogłaby wystarczyć na potrzeby @Andrew , byłoby wspaniale, gdybyś mógł ją rozszerzyć o pewne wyjaśnienia, aby upewnić się, że przyszli czytelnicy mogą w pełni z niej skorzystać!
derM

1

Przykład Kotlina:

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

z fragmentu:

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

z Aktywności:

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

0

Używasz tego kodu w przypadku kliknięcia przycisku

// 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

Poprawka wyjątku awarii punktu zerowego: miałem przypadek, w którym klawiatura mogła się nie otwierać, gdy użytkownik kliknął przycisk. Musisz napisać instrukcję if, aby sprawdzić, czy getCurrentFocus () nie jest wartością null:

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

-2

Jeśli ustawisz android:singleLine="true", przycisk automatycznie ukrywa klawiaturę¡

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.