Событие onKeyDown не вызывается в первый раз?

У меня есть событие onKeyDown, которое не распознает первое нажатие клавиши (даже не входит в событие, я тестировал, создавая вывод «тост»). При втором нажатии клавиши и после все работает отлично. Если я нажму на другой элемент на экране и снова попытаюсь нажать клавишу, для его запуска снова потребуется еще одно нажатие клавиши. Вот код:

public boolean onKeyDown(int keyCode, KeyEvent event)
{
    switch (keyCode) {
    case KeyEvent.KEYCODE_DPAD_LEFT:
        scorered.performClick();
        return true;


    case KeyEvent.KEYCODE_1:
        red_m1.performClick();
        return true;


        case KeyEvent.KEYCODE_DPAD_RIGHT: 
        scoreblue.performClick();
        return true;


        case KeyEvent.KEYCODE_2: 
        blue_m1.performClick();
        return true;

        case KeyEvent.KEYCODE_BACK:
            finish();
        return true;
    }
    return true;
    }

Я был в тупике в течение нескольких часов, поэтому любая помощь очень ценится!


person android_man1    schedule 07.02.2012    source источник
comment
Вы включили setFocusableInTouchMode? и вам не нужно вызывать super.onKeyDown(keyCode, event); внутри keyDown()?   -  person kosa    schedule 07.02.2012
comment
к сожалению, оба они не работали для меня   -  person android_man1    schedule 08.02.2012


Ответы (2)


Я уверен, что для такого поведения есть веские причины, но не думайте, что снятие фокуса — это хорошее решение. Мой обходной путь - запустить событие keydown, которое «активирует» обычную функциональность onKeyDown. Вот фрагмент:

new Thread(new Runnable() {         
    @Override
    public void run() {
        Instrumentation inst = new Instrumentation();
        inst.sendKeyDownUpSync(KeyEvent.KEYCODE_DPAD_UP);
    }

}).start(); 
person boba911    schedule 30.01.2014

Чтобы исправить это, обходным путем является удаление фокуса просмотра перед нажатием любой клавиши DPAD. Это работает в моем случае. У меня точно такая же проблема: когда представление активности Android находится в фокусе, самое первое ключевое событие DPAD, то есть событие KeyDown, игнорируется: ни один из этих методов не вызывается: onUserInteraction(), dispatchKeyEvent(), onKeyDown(). Однако последующие ключевые события DPAD — KeyUp, KeyDown, KeyUp, ... могут быть захвачены.

Обратите внимание, что эта проблема не возникает ни с программными клавишами («Домой», «Назад», «Недавние»), ни с аппаратными клавишами (BUTTON_A, BUTTON_B, BUTTON_X, BUTTON_Y).

person jonathanzh    schedule 05.07.2013
comment
В конструкторе производного класса SurfaceView добавьте setFocusableInTouchMode(true) сразу после вызова setFocusable(true). - person jonathanzh; 03.06.2014