Android keyListener在模拟器上运行良好,但在设备上运行不正常

时间:2011-02-19 17:19:23

标签: android keylistener

我正在制作游戏的第一阶段。我有一个drawable,我想在屏幕上移动,同时按住dpad箭头。

我设置了一个自定义视图,覆盖了onKeyDown和onKeyUp,我有一个switch语句来识别被按下的键。如果按下某个键,该键的布尔值将变为true。如果键被释放,则布尔值变为false。在另一个例程中,检查布尔值并更新移动。

问题是,我正在测试它的设备是G2,它有自己独特的键盘没有dpad,所以我也做了i,j,l,m作为移动的箭头。 (参见here,点击图片)在Android模拟器中,我的设置和移动效果很好。但是,在实际设备上,可绘制的按钮根本不响应任何按键。我的兄弟正在为我测试这个(我的手机没有键盘)所以我无法在实际设备上进行调试。

我的问题是: KeyEvent.KEYCODE_ *常量对于不同的键盘是不同的(即qwerty,非qwerty等)?我是否需要在代码中指定要使用的特定键盘(例如键盘映射)?

欢迎任何帮助或建议。 感谢。

如果需要,这是一个从onKeyDown调用的doKeyDown例程的示例(非常基于LunarLander示例源):

boolean doKeyDown(int keyCode, KeyEvent msg) {
        synchronized (mSurfaceHolder) {
         //   Log.d("KeyDown", "The key pressed was:" + keyCode);
         //   Log.d("KeyDown", "UP: " + mMove_Up + " DOWN: " + mMove_Down + " LEFT: " + mMove_Left +" RIGHT: " + mMove_Right);

            mIsDown = false;
            boolean handled = false;

            switch (keyCode)
            {
            case KeyEvent.KEYCODE_DPAD_UP:
                mMove_Up = true;
                handled = true;
                break;
            case KeyEvent.KEYCODE_I:  //Also up
                mMove_Up = true;
                handled = true;
                break;
            case KeyEvent.KEYCODE_DPAD_DOWN:
                mMove_Down = true;
                handled = true;
                break;
            case KeyEvent.KEYCODE_M:  //Also down
                mMove_Down = true;
                handled = true;
                break;
            case KeyEvent.KEYCODE_DPAD_LEFT:
                mMove_Left = true;
                handled = true;
                break;
            case KeyEvent.KEYCODE_J:  // Also left
                mMove_Left = true;
                handled = true;
                break;
            case KeyEvent.KEYCODE_DPAD_RIGHT:
                mMove_Right = true;
                handled = true;
                break;
            case KeyEvent.KEYCODE_L:  // Also right
                mMove_Right = true;
                handled = true;
                break;
            }


            return handled;
        }
    }

1 个答案:

答案 0 :(得分:1)

只是所以后来有同样问题的人都可以解决这个问题,我解决了这个问题。这是一个菜鸟/菜鸟的错误。

我所做的只是在自定义视图的构造函数中添加2行(我很确定只需要第一行):

setFocusable(true);

setFocusableInTouchMode(true);

显然,这些对于视图能够获取关键命令是必要的(但奇怪的是,它在模拟器中没有它们的情况下工作)。通过这些线路验证了在硬件上的工作问题解决了