Pourquoi onKey () est-il appelé deux fois?

85

J'utilise ce code:

public boolean onKey(View v, int keyCode, KeyEvent event) {
msg = (EditText)findViewById(R.id.msg);
String message = msg.getText().toString();
            if(keyCode == 66)
            {
                //It's hitting here twice.          
            }
            return false;
        };

Quelqu'un peut-il me dire pourquoi il frappe deux fois lorsque j'appuie sur Entrée?

SPB
la source
18
Une fois en bas, une fois en haut? Essayez onKeyDown () ou onKeyUp (), ou vérifiez KeyEvent.getAction ().
benvd

Réponses:

209

OnKey est déclenché deux fois: la première fois pour la touche enfoncée et la deuxième fois pour la touche vers le haut, vous devez donc filtrer:

YOUR_VIEW.setOnKeyListener(new OnKeyListener()
        {                           
            @Override
            public boolean onKey(View v, int keyCode, KeyEvent event) {

                //This is the filter
                if (event.getAction()!=KeyEvent.ACTION_DOWN)
                    return true;

                switch (keyCode) {
                case KeyEvent.KEYCODE_1 : 
                    MakeToast(1);
                    break;
                case KeyEvent.KEYCODE_2 : 
                    MakeToast(2);
                    break;
                case KeyEvent.KEYCODE_3 : 
                    MakeToast(3);
                    break;

                }

                return true;
            }

        });
Redax
la source
2
Le retour de vrai ou faux a-t-il un sens pour les super classes?
OrhanC1
6
Vous devez retourner false sur les clés qui ne sont pas traitées?
yostane
2
Apparemment, cela devrait être return falsepour les clés non traitées. J'ai mis ce code et lorsque le EditTextfocus a été mis sur mon application cesse de répondre au bouton de retour ...
luiges90
Cela arrêtera d'écouter keyevent dpad_center comme onClick
A_rmas
Merci pour event.getAction()!=KeyEvent.ACTION_DOWN, mais je reviens falsedans ce cas. Si true, toutes les autres clés seront consommées. Vous ne quitterez même pas votre activité / fragment avec le bouton Retour!
CoolMind
1
 itemView.setOnKeyListener(new View.OnKeyListener() {
  @Override
  public boolean onKey(View v, int keyCode, KeyEvent event) {
    int pos = getAdapterPosition();
    if (event.getAction() == KeyEvent.ACTION_DOWN && event.getKeyCode() == KeyEvent.KEYCODE_MENU){
     //code here
    }
    return false;
  }
 });
Victor Sam VS
la source
0
edittext.setOnKeyListener(new View.OnKeyListener() {
        @Override
        public boolean onKey(View view, int i, KeyEvent keyEvent) {
            if (keyEvent.getAction() == KeyEvent.ACTION_DOWN || keyEvent.getAction() == KeyEvent.ACTION_UP) {
                switch (i) {
                    case KeyEvent.KEYCODE_ENTER:
                        if (!HelperFunction.isStringEmpty(edittext.getText().toString())) {

                            if (loadCount == 0) {

                                loadCount ++;


                            }
                        }
                    default:
                        return false;
                }
            }
            return false;
        }

ce bloc de code empêche d'appeler le code deux fois. J'utilise la valeur de chaîne loadCount, si loadCount == 0 exécute mon bloc de code et je fais loadCount ++ dans mon bloc if. Ainsi, mon bloc de code fonctionne à temps.

ozanurkan
la source
Pensez à expliquer ce que fait votre code et comment il résout le problème.
Ankit