onKeyDown并不总是在Android应用程序中调用

时间:2009-10-20 05:02:53

标签: android user-interface events

我已经创建了一个简单的Android游戏,基于Lunar Lander示例,我遇到了处理关键事件的问题。当活动开始时,onKeyDown或onKeyUp被调用的唯一键是dpad上/下/左/右键。菜单,后退或dpad_center键都不会触发onKey方法。但是,一旦我按下其中一个dpad上/下/左/右按钮,按下菜单,后退或dpad_center键就会触发这些方法。我没有收到任何错误,也没有任何错误迹象。

焦点可能设置错误 - 活动从屏幕上的按钮开始,因此可能处于触摸屏模式。如果是这种情况,不应该触摸后退按钮让我进入正确的对焦模式,以便我可以抓住事件?

我正在使用SDK-1.5r3中的模拟器。我还没能在真正的手机上试试这个。这是我的onKeyDown。

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

由于

马特

2 个答案:

答案 0 :(得分:26)

这是onKeyDown在视图中还是在活动中?

如果调用setContentView传入视图,并且该视图调用了setFocusable(true),则所有关键事件都将绕过活动并直接进入视图。

另一方面,如果您的onKeyDown在视图中,并且您没有在视图上调用Activity和setFocusable(true)上的setContentView,那么您的Activity将获取关键事件而不是视图。

寻找那些特定的电话,但我认为你认为这是一个焦点问题。

答案 1 :(得分:8)

不总是调用Activity的onKeyDown / onKeyUp方法。与他们不同,dispatchKeyEvent总是在Activity上激活。在这里移动keydown / keyup逻辑。效果很好。

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