为什么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

Answers:


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 2012年

6
您应该在未处理的键上返回false吗?
yostane

2
显然,它应该return false用于未处理的密钥。我放入此代码,当EditText焦点移到我的应用停止响应后退按钮时……
luiges90 2014年

这样做将停止监听keyevent dpad_center作为onClick
A_rmas '16

感谢您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运行我的代码块,并且我在if块中执行loadCount ++。因此,我的代码阻止工作按时进行。


考虑提供有关代码功能以及如何解决问题的说明。
Ankit
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.