2010-04-18 22 views
11

Użyłem trochę kodu Android zastąpić przycisk „Gotowe” w moim polu EditText:Android: Ukrywanie klawiaturę w zastąpionej „Gotowe” naciśnięcie klawisza z EditText

myEditField.setOnEditorActionListener(new TextView.OnEditorActionListener() { 
     @Override 
     public boolean onEditorAction(TextView v, int actionId, KeyEvent event) { 
      if (actionId == EditorInfo.IME_ACTION_DONE) { 

       mySubroutine(); 

       return true; 
      } 
      return false; 
     } 
    }); 

Aktywacja pole wywołuje klawiatury i naciśnięcie "Gotowe" powoduje pomyślną ocenę funkcji mySubroutine(). Jednak klawiatura nie zniknie po naciśnięciu przycisku "Gotowe". Jak przywrócić to domyślne zachowanie do procedury?

Odpowiedz

43

Dlaczego nie:

myEditField.setOnEditorActionListener(new TextView.OnEditorActionListener() { 
    @Override 
    public boolean onEditorAction(TextView v, int actionId, KeyEvent event) { 
     if (actionId == EditorInfo.IME_ACTION_DONE) { 

      mySubroutine(); 
     } 
     return false; 
    } 
}); 

Wystarczy return false po sobie swój kod. Można to zinterpretować bez względu na to, jaki jest twój kod (mySubroutine()), ale potem będzie nadal używał domyślnej akcji. Jeśli zwrócisz "true", mówisz, że jesteś szczęśliwym programistą i wszystko, co musisz zrobić, ma miejsce w twoim mySubroutine(), a domyślne działanie nie musi działać.

+0

To jest właściwy sposób, ponieważ w przeciwnym razie będziesz sprzeczny z tym, jak zaprojektowano framework. Omówiłem to w odpowiedzi na pytanie w zbyt dużym stopniu [tutaj] (http://stackoverflow.com/a/25119481/2837443) –

+0

Nie dotknąłem kodu Android w ciągu czterech lat, więc wezmę twoje słowo na to. –

12

Można zamknąć klawiaturę, wykonując:

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

Używam Eclipse i Dostaję dwa następujące błędy: „InputMethodManager nie mogą być rozwiązane do typu” i „Metoda getWindowToken () jest niezdefiniowany dla nowego typu TextView.onEditorActionListener() {} " Nie jestem zbyt dobrym programistą Java, więc nie wiem jak je interpretować. Czy muszę dołączyć coś wcześniej? –

+0

Spróbuj nacisnąć Control + Shift + O, aby wykonać odpowiednie importowanie. – Macarse

+5

Dzięki, była zależność, której potrzebowałem. Musiałem również zastąpić getWindowToken() v.getWindowToken(), ale poza tym działa świetnie, dzięki! Teraz po prostu muszę zrozumieć, co zrobił –

7

Musisz dołączyć onClickListener do przycisku, który wykonuje następujący kod:

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

nieczytelna odpowiedź – AlexVogel

+0

To zadziałało u mnie – SolArabehety

0

miałem ten sam problem. Natychmiast po zmianie parametru editText VISIBILITY z GONE na VISIBLE musiałem ustawić ostrość i wyświetlić miękką klawiaturę. I to osiągnąć za pomocą następującego kodu:

 (new Handler()).postDelayed(new Runnable() { 

     public void run() {    yourEditText.dispatchTouchEvent(MotionEvent.obtain(SystemClock.uptimeMillis(), SystemClock.uptimeMillis(), MotionEvent.ACTION_DOWN , 0, 0, 0)); 
      yourEditText.dispatchTouchEvent(MotionEvent.obtain(SystemClock.uptimeMillis(), SystemClock.uptimeMillis(), MotionEvent.ACTION_UP , 0, 0, 0));      

     } 
    }, 200); 
Powiązane problemy