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

엔터를 눌렀을 때 두 번 치는 이유를 알려주세요.


18
한번 내려 가면 한번? onKeyDown () 또는 onKeyUp ()을 시도하거나 KeyEvent.getAction ()을 확인하십시오.
— benvd

답변:


209

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
true 또는 false를 반환하는 것이 수퍼 클래스에 의미가 있습니까?
— OrhanC1

6
처리되지 않은 키에 대해 false를 반환해야합니까?
— yostane

2
분명히 return false처리되지 않은 키에 대한 것 입니다. 나는이 코드를 삽입하고,이 때 EditText이 내 응용 프로그램 중지 뒤로 버튼에 응답 ... 초점
— luiges90

이렇게하면 온 클릭 등의 KeyEvent dpad_center을 듣고 중지
— 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 == 0이면 내 코드 블록을 실행하고 if 블록에서 loadCount ++을 수행하는 경우 loadCount String value를 사용합니다. 따라서 내 코드 블록은 제 시간에 작동합니다.


코드가 수행하는 작업과 문제를 해결하는 방법에 대한 설명을 제공하는 것이 좋습니다.
— Ankit
당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.