我已经创建了一个简单的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);
}
由于
马特
答案 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;
}