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

Mat*_*inn 9 events user-interface android

我已经创建了一个简单的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);
}
Run Code Online (Sandbox Code Playgroud)

谢谢

马特

has*_*man 28

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

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

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

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

  • 它在视图中 - 但在检查时,我意识到我没有启用setFocusableInTouchMode - 添加它来修复问题. (7认同)

yul*_*kov 9

并不总是调用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;
}
Run Code Online (Sandbox Code Playgroud)

  • 而不是返回`false`,调用super并在结尾返回结果. (4认同)