onKeyDown не всегда вызывается в Android-приложении

Я создал простую игру для android, основанную на образце Lunar Lander, и у меня возникли проблемы с обработкой ключевых событий. Когда начинается действие, вызываются только клавиши onKeyDown или onKeyUp-это клавиши dpad up/down/left/right. Ни клавиши menu, back или dpad_center не запускают методы onKey. Однако, как только я нажал одну из кнопок dpad up/down/left/right, нажатие клавиш menu, back или dpad_center запускает эти методы. Я не получаю никаких ошибок или каких-либо указание на то, что происходит не так.

возможно, что фокус установлен неправильно-действие запускается с кнопки на экране, поэтому оно может быть в режиме сенсорного экрана. Если это так, разве прикосновение к кнопке "Назад" не должно привести меня в правильный режим фокусировки, чтобы я мог поймать событие?

Я использую эмулятор из SDK-1.5r3. Я еще не смог попробовать это на реальном телефоне. Вот мой onKeyDown.

public boolean onKeyDown(int keyCode, KeyEvent msg)
{
    Log.d(TAG, "onKeyDown: " + keyCode);
    return super.onKeyDown(keyCode, msg);
}

спасибо

Matt

2 ответов


это onKeyDown в представлении или в деятельности?

Если setContentView называется передачей в представлении, и это представление имеет setFocusable(true) вызывается на нем, все ключевые события будут обходить действие и идти прямо в представление.

с другой стороны, если ваш onKeyDown находится в представлении, и вы не вызвали setContentView в Activity и setFocusable(true) в представлении, тогда ваша активность получит ключевые события, а не представление.

искать тех конкретные звонки, но я думаю, что вы правы в том, что это проблема фокуса.


Activity OnKeyDown/onKeyUp методы не всегда вызываются. В отличие от них dispatchKeyEvent на деятельность увольняли всегда. Перемещать клавиша вниз/клавиша вверх логики здесь. Хорошо работать.

@Override
public boolean dispatchKeyEvent(KeyEvent event) {
    if (event.getAction() == KeyEvent.ACTION_DOWN) {
        // keydown logic
        return true;
    }
    return false;
}