122 votes

Détecter quand l'utilisateur a congédié le clavier logiciel

J'ai un EditText widget de mon point de vue. Lorsque l'utilisateur sélectionne l'EditText widget, afficher des instructions et le clavier s'affiche.

J'utilise un OnEditorActionListener pour détecter lorsque l'utilisateur a terminé de saisie de texte et j'ai fermer le clavier, masquer les instructions et effectuer une action.

Mon problème est que lorsque l'utilisateur ferme le clavier en appuyant sur la touche RETOUR. Le système d'exploitation rejette le clavier, mais mes instructions (que j'ai besoin de cacher) sont encore visibles.

J'ai essayé primordial OnKeyDown, mais qui ne semble pas appelée lorsque le bouton de RETOUR est utilisé pour fermer le clavier.

J'ai essayé de fixer un OnKeyListener sur l'EditText widget, mais qui ne semble pas être appelé.

Comment puis-je détecter lorsque le clavier est rejetée?

165voto

Jay Points 549

Je connais un moyen de le faire. Sous-classe EditText et implémentez:

 @Override
public boolean onKeyPreIme(int keyCode, KeyEvent event) {
  if (event.getKeyCode() == KeyEvent.KEYCODE_BACK) {
    // Do your thing.
    return true;  // So it is not propagated.
  }
  return super.dispatchKeyEvent(event);
}
 

Voici un lien sur la façon d'utiliser vos vues personnalisées (pour la sous-classe EditText): http://developer.android.com/guide/topics/ui/custom-components.html

127voto

olivier_sdg Points 413

Jay, ta solution est bonne! Merci :)

 public class EditTextBackEvent extends EditText {

    private EditTextImeBackListener mOnImeBack;

    public EditTextBackEvent(Context context) {
        super(context);
    }

    public EditTextBackEvent(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    public EditTextBackEvent(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
    }

    @Override
    public boolean onKeyPreIme(int keyCode, KeyEvent event) {
        if (event.getKeyCode() == KeyEvent.KEYCODE_BACK && event.getAction() == KeyEvent.ACTION_UP) {
            if (mOnImeBack != null) mOnImeBack.onImeBack(this, this.getText().toString());
        }
        return super.dispatchKeyEvent(event);
    }

    public void setOnEditTextImeBackListener(EditTextImeBackListener listener) {
        mOnImeBack = listener;
    }

}

public interface EditTextImeBackListener {
    public abstract void onImeBack(EditTextBackEvent ctrl, String text);
}
 

19voto

Steelight Points 1293

J'ai légèrement modifié la solution de Jay en appelant super.onKeyPreIme ():

             _e = new EditText(inflater.getContext()) {
                @Override
                public boolean onKeyPreIme(int keyCode, KeyEvent event)
                {
                    if (event.getKeyCode() == KeyEvent.KEYCODE_BACK)
                    {
                        cancelTextInput();
                    }
                    return super.onKeyPreIme(keyCode, event);
                }
            };
 

Merveilleuse solution, Jay, +1!

1voto

Steve Pomeroy Points 3968

Cette question (avec pas encore de réponse et l'air sombre) semble être la même question: http://stackoverflow.com/questions/2150078/android-is-software-keyboard-shown

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X