onKey в активности не вызывается

Я хочу смоделировать серию ключевых событий. Потратив немного времени на поиски, я нашел sendkeyEvent метод объектов типа BaseInputConnection. Итак, в функции onCreate() класса MainActivity я трижды отправляю ключевое событие в текстовое представление, которое я привязываю к этому действию.

@Override
protected void onCreate(Bundle savedInstanceState){
  ...
  TextView tv = (TextView) findViewById(R.id.sample_text);
  tv.setText(stringFromJNI);
  tv.setOnKeyListener(this);

  BaseInputConnection mInputConnection = new BaseInputConnection(tv, true);
  //BaseInputConnection mInputConnection = new BaseInputConnection(tv, false);
  KeyEvent kleft = new KeyEvent(KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_DPAD_LEFT);
  for(int i=0;i<3;i++){
    mInputConnection.sendKeyEvent(kleft);
    Log.d(TAG, "keyevent sent");
  }
}

Класс MainActivity реализует интерфейс OnKeyListener.

@Override
public boolean OnKey(View v, int keyCode, KeyEvent){
  Log.d(TAG, "OnKey starts.");
  if(event.getKeyCode()==KeyEvent.KEYCODE_DPAD_LEFT && event.getAction()==KeyEvent.ACTION_DOWN){
    Log.d(TAG, "key left.");
    return true;
  }
  return false;
}

Проверив вывод logcat, я обнаружил, что «keyevent send» трижды был printend, что означает, что ключевые события были отправлены. Но не было "запусков OnKey". Почему функция OnKey() не была вызвана?


person dudu    schedule 17.10.2017    source источник


Ответы (3)


¿ Можете ли вы попробовать использовать этот метод? onKeyDown у меня работает

@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
 switch (keyCode) {
 case KeyEvent.KEYCODE_MENU:
    /* Sample for handling the Menu button globally */
    return true;
 }
 return false;
} 
person Pabel    schedule 17.10.2017

OnKeyListener работает только с аппаратными клавиатурами». Проверьте эту ссылку.

https://developer.android.com/reference/android/view/View.OnKeyListener.html

Вместо этого используйте TextWatchListener для изменения текста textView.

tv.addTextChangedListener(new TextWatcher() {
        @Override
        public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {

        }

        @Override
        public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {

        }

        @Override
        public void afterTextChanged(Editable editable) {

        }
    });
person Sharath kumar    schedule 17.10.2017
comment
Спасибо, что указали, что OnKeyListener работает только с аппаратными клавиатурами. Это объясняет, почему моя функция OnKey не была вызвана. Но я хочу, чтобы действие (или представление, или какая-либо служба) обрабатывало виртуальные ключевые события, которые не генерируются с реальных клавиатур или программных. - person dudu; 17.10.2017
comment
Думаю, даже наблюдатель за текстом решит вашу проблему. - person Sharath kumar; 17.10.2017

Попробуйте это вместо onKey()

    @Override
            public boolean dispatchKeyEvent(KeyEvent event) {
                if(event.getKeyCode()==KeyEvent.KEYCODE_DPAD_LEFT && event.getAction()==KeyEvent.ACTION_DOWN){
                   Log.d(TAG, "key left.");
                   return true;
               }
                return super.dispatchKeyEvent(event);
            }
person Ghulam Moinul Quadir    schedule 17.10.2017
comment
Я пытался, но это не удалось. Мне любопытно, какая связь между текстовым представлением и активностью? Так как с функцией sendKeyEvent ключевое событие может быть отправлено только в представление. Так почему же активность dispatchKeyEvent напрямую связана с событием? Я предполагаю, что это связано со стратегией отправки событий Android, но я не совсем понимаю. - person dudu; 18.10.2017
comment
Вы можете получить некоторую информацию по этой ссылке: Предоставлены методы dispatchkeyevent"> stackoverflow.com/questions/7846050/ - person Ghulam Moinul Quadir; 18.10.2017