【问题标题】:Android keyListener working well on emulator, but not on deviceAndroid keyListener 在模拟器上运行良好,但在设备上运行良好
【发布时间】:2011-02-19 17:19:22
【问题描述】:

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

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

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

我的问题是: 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;
        }
    }

【问题讨论】:

  • LogCat 在第一次按下键时在模拟器中显示:02-19 10:24:58.817: WARN/KeyCharacterMap(343): No keyboard for id 0 02-19 10:24:58.817: WARN /KeyCharacterMap(343):使用默认键盘映射:/system/usr/keychars/qwerty.kcm.bin

标签: android keylistener


【解决方案1】:

只是为了让以后遇到同样问题的人都能解决这个问题,我解决了这个问题。这是一个菜鸟/菜鸟的错误。

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

setFocusable(true);

setFocusableInTouchMode(true);

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

【讨论】: