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.