¿Por qué se llama a onKey () dos veces?

85

Estoy usando este código:

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;
        };

¿Alguien puede decirme por qué está presionando dos veces cuando presiono enter?

SPB
fuente
18
¿Una vez abajo, una vez arriba? Pruebe onKeyDown () o onKeyUp (), o verifique KeyEvent.getAction ().
benvd

Respuestas:

209

OnKey se dispara dos veces: la primera vez para presionar la tecla y la segunda para subir la tecla, por lo que debe filtrar:

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
fuente
2
¿Devolver verdadero o falso tiene algún significado para las superclases?
OrhanC1
6
¿Debería devolver falso en las claves que no se procesan?
yostane
2
Aparentemente, debería ser return falsepara claves no procesadas. Puse este código y cuando el EditTextenfoque tiene mi aplicación deja de responder al botón de retroceso ...
luiges90
Hacer esto dejará de escuchar keyevent dpad_center como onClick
A_rmas
Gracias por event.getAction()!=KeyEvent.ACTION_DOWN, pero vuelvo falseen este caso. Si true, se consumirán otras claves. ¡Ni siquiera saldrá de su actividad / fragmento con el botón Atrás!
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;
  }
 });
Víctor Sam VS
fuente
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;
        }

este bloque de código evita llamar al código dos veces. Utilizo el valor de cadena loadCount, si loadCount == 0 ejecuto mi bloque de código y estoy haciendo loadCount ++ en mi bloque if. Entonces, el bloque de My Code funciona a tiempo.

ozanurkan
fuente
Considere proporcionar una explicación de lo que hace su código y cómo resuelve el problema.
Ankit