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

Andrzej
źródło

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.

Paul Maserrat
źródło
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;
    }
});
Andrzej
źródło
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) {

        }
    }
});
Prashant Maheshwari Andro
źródło
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.

piksel
źródło
Ś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);
Ashana.Jackol
źródło
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)
Laert
źródło
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);
Priya Rajan
źródło
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);
}
Giedrius Šlikas
źródło
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);
Affa Musaffa
źródło
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}
Farruh Habibullaev
źródło
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)
norbDEV
źródło
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);
}
Pankaj Talaviya
źródło
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);
CacheMeOutside
źródło
-2

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

Terranology
źródło