Warum wird onKey () zweimal aufgerufen?

85

Ich benutze diesen 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;
        };

Kann mir bitte jemand sagen, warum es zweimal trifft, wenn ich die Eingabetaste drücke?

SPB
quelle
18
Einmal runter, einmal rauf? Versuchen Sie es mit onKeyDown () oder onKeyUp () oder überprüfen Sie KeyEvent.getAction ().
Benvd

Antworten:

208

OnKey wird zweimal ausgelöst: das erste Mal für den Schlüssel nach unten und das zweite Mal für den Schlüssel nach oben. Sie müssen also filtern:

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
quelle
2
Hat die Rückgabe von wahr oder falsch eine Bedeutung für die Superklassen?
OrhanC1
6
Sie sollten false für Schlüssel zurückgeben, die nicht verarbeitet werden?
Yostane
2
Anscheinend sollte es return falsefür Schlüssel nicht verarbeitet werden. Ich habe diesen Code EditText
eingegeben
Wenn Sie dies tun, hören Sie nicht mehr auf keyevent dpad_center als onClick
A_rmas
Danke dafür event.getAction()!=KeyEvent.ACTION_DOWN, aber ich komme falsein diesem Fall zurück. Wenn true, werden alle anderen Schlüssel verbraucht. Sie werden Ihre Aktivität / Ihr Fragment nicht einmal mit der Schaltfläche Zurück beenden!
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
quelle
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;
        }

Dieser Codeblock verhindert das zweimalige Aufrufen des Codes. Ich verwende den Wert loadCount String, wenn loadCount == 0 meinen Codeblock ausführt und ich loadCount ++ in meinem if-Block mache. Mein Codeblock funktioniert also pünktlich.

Ozanurkan
quelle
Erwägen Sie eine Erklärung, was Ihr Code tut und wie er das Problem löst.
Ankit