【问题标题】:onKeyDown event not called the first time?onKeyDown 事件不是第一次调用?
【发布时间】:2012-02-07 14:29:27
【问题描述】:

我有一个 onKeyDown 事件,它无法识别第一次按键(甚至不会进入该事件,我已经通过生成“toast”输出进行了测试)。在第二次按键及之后,它完美地工作。如果我单击屏幕上的另一个元素并再次尝试按键,它再次需要另一个按键才能让它继续。代码如下:

public boolean onKeyDown(int keyCode, KeyEvent event)
{
    switch (keyCode) {
    case KeyEvent.KEYCODE_DPAD_LEFT:
        scorered.performClick();
        return true;


    case KeyEvent.KEYCODE_1:
        red_m1.performClick();
        return true;


        case KeyEvent.KEYCODE_DPAD_RIGHT: 
        scoreblue.performClick();
        return true;


        case KeyEvent.KEYCODE_2: 
        blue_m1.performClick();
        return true;

        case KeyEvent.KEYCODE_BACK:
            finish();
        return true;
    }
    return true;
    }

我已经被难住了好几个小时,所以非常感谢任何帮助!

【问题讨论】:

  • 您是否启用了 setFocusableInTouchMode?你不需要调用 super.onKeyDown(keyCode, event);在 keyDown() 里面?
  • 不幸的是,这两个都不适合我

标签: android keypress onkeydown


【解决方案1】:

我敢肯定,这种行为有充分的理由,但不要认为移除焦点是一个很好的解决方案。我的解决方法是触发一个 keydown 事件,即“激活”常规 onKeyDown 功能。这是sn-p:

new Thread(new Runnable() {         
    @Override
    public void run() {
        Instrumentation inst = new Instrumentation();
        inst.sendKeyDownUpSync(KeyEvent.KEYCODE_DPAD_UP);
    }

}).start(); 

【讨论】:

    【解决方案2】:

    要解决此问题,解决方法是在按下任何 DPAD 键之前移除视图焦点。它适用于我的情况。我遇到了完全相同的问题:当 Android Activity 的视图成为焦点时,第一个 DPAD 键事件,即 KeyDown 事件,被忽略:这些方法都没有被调用:onUserInteraction(),@987654323 @,onKeyDown()。但是,可以捕获后续的 DPAD 关键事件 - KeyUpKeyDownKeyUp、...。

    请注意,软键(Home、Previous、Recents)和硬键(BUTTON_A、BUTTON_B、BUTTON_X、BUTTON_Y)不会出现此问题。

    【讨论】:

    • 在你的 SurfaceView 派生类的构造函数中,在调用 setFocusable(true) 之后添加 setFocusableInTouchMode(true)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多