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

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

¿Puede alguien decirme por qué está golpeando dos veces cuando presiono enter?

OnKey se dispara dos veces: la primera vez para presionar la tecla, y la segunda vez para la tecla arriba, 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; } }); 
 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. Uso loadCount String value, si loadCount == 0 ejecuta mi bloque de código y estoy haciendo loadCount ++ en mi bloque if. Entonces mi código bloquea el trabajo a tiempo.