Détection lorsque l'utilisateur a rejeté le clavier doux

J'ai un widget EditText à mon avis. Lorsque l'utilisateur sélectionne le widget EditText, j'indique quelques instructions et le clavier logiciel apparaît.

J'utilise un OnEditorActionListener pour détecter quand l'utilisateur a terminé l'entrée de texte et je retire le clavier, cache les instructions et effectue des actions.

  • Utilisation d'une application Mock Location in Navigation
  • Comment arrêter l'exécution de Javascript dans Android Webview
  • Documentation des tâches Ant Ant disponibles pour Android?
  • BroadcastReceiver onReceive timeout
  • Comment accéder aux ressources dessables (couleur) dans java
  • Android - Style d'attribut inconnu sur une étiquette de fragment
  • Mon problème est lorsque l'utilisateur rejette le clavier en appuyant sur la touche RETOUR. L'OS rejette le clavier, mais mes instructions (dont j'ai besoin de cacher) sont encore visibles.

    J'ai essayé d'annuler OnKeyDown, mais cela ne semble pas être appelé lorsque le bouton BACK est utilisé pour supprimer le clavier.

    J'ai essayé de définir un OnKeyListener sur le widget EditText, mais cela ne semble pas être appelé non plus.

    Comment puis-je détecter quand le clavier doux est licencié?

    7 Solutions collect form web for “Détection lorsque l'utilisateur a rejeté le clavier doux”

    Cette question (sans réponse pour le moment et semble sombre) semble poser la même question: comment vérifier la visibilité du clavier logiciel dans Android?

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

    @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

    Jay, votre 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); } 

    J'ai fait un léger changement sur 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); } }; 

    Solution merveilleuse, Jay, +1!

    Voici mon EditText personnalisé pour détecter si le clavier s'affiche ou non

     /** * Created by TheFinestArtist on 9/24/15. */ public class KeyboardEditText extends EditText { public KeyboardEditText(Context context) { super(context); } public KeyboardEditText(Context context, AttributeSet attrs) { super(context, attrs); } public KeyboardEditText(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); } @Override protected void onFocusChanged(boolean focused, int direction, Rect previouslyFocusedRect) { super.onFocusChanged(focused, direction, previouslyFocusedRect); if (listener != null) listener.onStateChanged(this, true); } @Override public boolean onKeyPreIme(int keyCode, @NonNull KeyEvent event) { if (event.getKeyCode() == KeyEvent.KEYCODE_BACK && event.getAction() == KeyEvent.ACTION_UP) { if (listener != null) listener.onStateChanged(this, false); } return super.onKeyPreIme(keyCode, event); } /** * Keyboard Listener */ KeyboardListener listener; public void setOnKeyboardListener(KeyboardListener listener) { this.listener = listener; } public interface KeyboardListener { void onStateChanged(KeyboardEditText keyboardEditText, boolean showing); } } 

    Créez simplement une classe qui étend Edittext et utilise ce edittext dans votre code, vous devez simplement remplacer la méthode suivante dans l'edittext personnalisé:

     @Override public boolean onKeyPreIme(int keyCode, KeyEvent event) { if (keyCode == KeyEvent.KEYCODE_BACK) { //Here it catch all back keys //Now you can do what you want. } else if (keyCode == KeyEvent.KEYCODE_MENU) { // Eat the event return true; } return false;} 

    Voici une solution avec l'auditeur de la clé. Je ne sais pas pourquoi cela fonctionne, mais OnKeyListener fonctionne si vous venez d'annuler uniquement onKeyPreIme sur votre EditText personnalisé.

    SomeClass.java

     customEditText.setOnKeyListener((v, keyCode, event) -> { if(event.getAction() == KeyEvent.ACTION_DOWN) { switch (keyCode) { case KeyEvent.KEYCODE_BACK: getPresenter().onBackPressed(); break; } } return false; }); 

    CustomEditText.java

     @Override public boolean onKeyPreIme(int keyCode, KeyEvent event) { return super.dispatchKeyEvent(event); } 
    coAndroid est un fan Android de Google, tout sur les téléphones Android, Android Wear, Android Dev et Android Games Apps.