Por que onKey () é chamado duas vezes?

85

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

Alguém pode me dizer por que está batendo duas vezes quando pressiono Enter?

SPB
fonte
18
Uma vez para baixo, uma vez para cima? Tente onKeyDown () ou onKeyUp () ou marque KeyEvent.getAction ().
benvd

Respostas:

210

OnKey é disparado duas vezes: a primeira vez para a tecla pressionada e a segunda vez para a tecla acima, então você deve 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
fonte
2
Retornar verdadeiro ou falso tem algum significado para as superclasses?
OrhanC1
6
Você deve retornar falso nas chaves que não são processadas?
yostane
2
Aparentemente, deve ser return falsepara chaves não processadas. Coloquei este código e quando o EditTextfoco meu aplicativo para de responder ao botão Voltar ...
luiges90
Isso interromperá a escuta do keyevent dpad_center como onClick
A_rmas,
Obrigado por event.getAction()!=KeyEvent.ACTION_DOWN, mas volto falseneste caso. Se true, qualquer outra chave será consumida. Você nem sairá de sua atividade / fragmento com o botão Voltar!
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
fonte
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 bloco de código evita chamar o código duas vezes. Eu uso o valor loadCount String, se loadCount == 0 execute meu bloco de código e estou fazendo loadCount ++ em meu bloco if. Portanto, meu bloco de código funciona na hora certa.

Ozanurkan
fonte
Considere fornecer uma explicação sobre o que seu código faz e como ele resolve o problema.
Ankit