2010-04-18 5 views
11

J'ai utilisé un peu de code Android pour remplacer le bouton « Terminé » dans mon champ EditText:Android: Hiding le clavier dans un débrayés « Done » KeyPress 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; 
     } 
    }); 

Activation du champ appelle la clavier, et en appuyant sur "Terminé" évalue mySubroutine() avec succès. Cependant, le clavier ne disparaît plus quand j'appuie sur "Done". Comment restaurer ce comportement par défaut à la routine?

Répondre

43

Pourquoi ne pas:

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

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

juste retour faux après que vous gérez votre code. Cela peut être interprété comme peu importe votre code (mySubroutine()), il utilisera toujours l'action par défaut par la suite. Si vous retournez "true", vous dites que vous êtes un codeur heureux et que tout ce qui doit être fait est arrivé dans mySubroutine() et que l'action par défaut n'a pas besoin d'agir.

+0

C'est la bonne façon, sinon vous allez aller à l'encontre de la façon dont le cadre a été conçu. Je l'ai développé dans la réponse _way-over-the-top_ dans une question connexe [ici] (http://stackoverflow.com/a/25119481/2837443) –

+0

Je n'ai pas touché le code Android dans quatre ans, alors je vais vous croire sur parole. –

12

Vous pouvez fermer le clavier en faisant:

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

J'utilise Eclipse et je reçois les deux erreurs suivantes: « InputMethodManager ne peut être résolu à un type » et « la méthode getWindowToken () n'est pas défini pour le nouveau type TextView.onEditorActionListener() {} " Je ne suis pas un programmeur Java, donc je ne sais pas comment les interpréter. Dois-je inclure quelque chose plus tôt? –

+0

Essayez d'appuyer sur Ctrl + Maj + o pour faire les importations correspondantes. – Macarse

+5

Merci, il y avait une dépendance dont j'avais besoin. J'ai aussi dû remplacer getWindowToken() avec v.getWindowToken() mais sinon ça marche super, merci! Maintenant, j'ai juste besoin de comprendre ce qu'il a fait –

7

Vous devez joindre un onClickListener au bouton qui exécute le code suivant:

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

illisible réponse – AlexVogel

+0

Cela a fonctionné pour moi – SolArabehety

0

J'ai eu le même problème. Immédiatement après que editText VISIBILITY est passé de GONE à VISIBLE, j'ai dû régler la mise au point et afficher le clavier logiciel. J'ai réalisé cela en utilisant le code suivant:

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