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?


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

        });

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

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.


Considere fornecer uma explicação sobre o que seu código faz e como ele resolve o problema.
Ankit
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.