ทำไม onKey () จึงถูกเรียกสองครั้ง


85

ฉันใช้รหัสนี้:

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

ใครช่วยบอกหน่อยได้ไหมว่าทำไมมันถึงกดสองครั้งเมื่อกด Enter


18
เมื่อลงครั้งเดียว? ลองใช้ onKeyDown () หรือ onKeyUp () หรือตรวจสอบ KeyEvent.getAction ()
benvd

คำตอบ:


210

OnKey จะเริ่มทำงานสองครั้ง: ครั้งแรกสำหรับการกดปุ่มลงและครั้งที่สองสำหรับการคีย์ขึ้นดังนั้นคุณต้องกรอง:

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
การส่งคืนจริงหรือเท็จมีความหมายต่อคลาสระดับสูงหรือไม่?
OrhanC1

6
คุณควรส่งคืนเท็จในคีย์ที่ไม่ได้รับการประมวลผล?
yostane

2
เห็นได้ชัดว่าควรใช้return falseสำหรับคีย์ที่ไม่ได้รับการประมวลผล ฉันใส่รหัสนี้และเมื่อEditTextโฟกัสแอพของฉันหยุดตอบสนองต่อปุ่มย้อนกลับ ...
luiges90

การทำเช่นนี้จะหยุดฟังคีย์เหตุการณ์ dpad_center ในขณะที่ onClick
A_rmas

ขอบคุณสำหรับevent.getAction()!=KeyEvent.ACTION_DOWNแต่ฉันกลับมาfalseในกรณีนี้ หากtrueคีย์อื่น ๆ จะถูกใช้ไป คุณจะไม่ออกจากกิจกรรม / ส่วนย่อยของคุณด้วยปุ่มย้อนกลับ!
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;
        }

บล็อกรหัสนี้ป้องกันไม่ให้เรียกรหัสซ้ำสองครั้ง ฉันใช้ค่า loadCount String ถ้า loadCount == 0 รันโค้ดบล็อกของฉันและฉันกำลังทำ loadCount ++ ใน if block ของฉัน บล็อกรหัสของฉันจึงทำงานตรงเวลา


พิจารณาให้คำอธิบายว่าโค้ดของคุณใช้ทำอะไรและแก้ปัญหาได้อย่างไร
Ankit
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.