Почему 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;
            }

        });
Redax
источник
2
Имеет ли какое-либо значение для суперклассов возврат true или false?
OrhanC1
6
Вы должны возвращать false для ключей, которые не обрабатываются?
Йостане
2
Видимо это должно быть return falseдля ключей, которые не обрабатываются. Я ввожу этот код, и когда он EditTextнаходится в фокусе, мое приложение перестает реагировать на кнопку «Назад» ...
luiges90
Это остановит прослушивание ключевого события dpad_center как
onClick
Спасибо 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;
  }
 });
Виктор Сэм VS
источник
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, если loadCount == 0 запускает мой блок кода, а я выполняю loadCount ++ в своем блоке if. Так что блок My Code работает вовремя.

озануркан
источник
Вы можете объяснить, что делает ваш код и как он решает проблему.
Ankit