Tại sao onKey () được gọi hai lần?


85

Tôi đang sử dụng mã này:

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

Bất cứ ai có thể vui lòng cho tôi biết tại sao nó nhấn hai lần khi tôi nhấn enter?


18
Một khi xuống, một khi lên? Hãy thử onKeyDown () hoặc onKeyUp () hoặc kiểm tra KeyEvent.getAction ().
benvd

Câu trả lời:


209

OnKey được kích hoạt hai lần: lần đầu tiên cho phím tắt và lần thứ hai cho phím lên, vì vậy bạn phải lọc:

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
Việc trả về true hay false có bất kỳ ý nghĩa nào đối với các siêu lớp không?
OrhanC1

6
Bạn nên trả về false trên các khóa không được xử lý?
yostane

2
Rõ ràng nó phải return falsedành cho các khóa không được xử lý. Tôi đặt mã này vào và khi EditTextcó tập trung dừng của tôi ứng dụng đáp ứng với nút quay lại ...
luiges90

Việc làm này sẽ dừng lại lắng nghe dpad_center keyevent như onClick
A_rmas

Cảm ơn vì event.getAction()!=KeyEvent.ACTION_DOWN, nhưng tôi quay lại falsetrong trường hợp này. Nếu true, bất kỳ khóa nào khác sẽ được sử dụng. Bạn thậm chí sẽ không thoát khỏi hoạt động / phân đoạn của mình bằng nút Quay lại!
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;
        }

khối mã này ngăn không cho gọi mã hai lần. Tôi sử dụng giá trị chuỗi loadCount, nếu loadCount == 0 chạy khối mã của tôi và tôi đang thực hiện loadCount ++ trong khối if của mình. Vì vậy, khối Mã của tôi hoạt động đúng giờ.


Cân nhắc cung cấp giải thích về những gì mã của bạn làm và cách nó giải quyết vấn đề.
Ankit
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.