【问题标题】:onKeyDown not always called in Android apponKeyDown 并不总是在 Android 应用程序中调用
【发布时间】:2009-10-20 05:02:53
【问题描述】:

我基于 Lunar Lander 示例创建了一个简单的 Android 游戏,但在处理关键事件时遇到了问题。当活动开始时,调用 onKeyDown 或 onKeyUp 的唯一键是 dpad 上/下/左/右键。 menu、back 或 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);
}

谢谢

马特

【问题讨论】:

    标签: android user-interface events


    【解决方案1】:

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

    如果 setContentView 被调用传入一个视图,并且该视图调用了 setFocusable(true) ,那么所有关键事件将绕过该活动并直接进入视图。

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

    寻找那些具体的电话,但我认为你是对的,因为这是一个焦点问题。

    【讨论】:

    • 它在视图中 - 但在检查时,我意识到我没有启用 setFocusableInTouchMode - 添加它以解决问题。
    • 啊,酷。很抱歉我错过了实际问题,但我很高兴能提供帮助。
    • 我在一个片段中尝试了这个,但我的视图的 onKeyDown() 从未被调用,即使我已将它的可聚焦性设置为 true:searchView.setFocusable(true); searchView.setFocusableInTouchMode(true);。 Activity 的 onKeyDown() 确实被调用了,但不幸的是,返回键没有被调用。
    • 我认为后退按钮在“onBackPressed”方法中得到了额外的处理
    • onKeyDown 可能不会被调用以响应KeyEvent.KEYCODE_MENUis 如果你有一个工具栏——dispatchKeyEvent 的基类实现可能决定工具栏处理事件,因为ToolbarActionBar.onMenuKeyEvent总是返回true
    【解决方案2】:

    Activity 的 onKeyDown/onKeyUp 方法并不总是被调用。与他们不同的是,Activity 上的 dispatchKeyEvent 总是被触发。在此处移动 keydown/keyup 逻辑。效果很好。

    @Override
    public boolean dispatchKeyEvent(KeyEvent event) {
        if (event.getAction() == KeyEvent.ACTION_DOWN) {
            // keydown logic
            return true;
        }
        return false;
    }
    

    【讨论】:

    • 感谢您发布此信息。非常有帮助:)
    • 不返回false,而是调用super并在最后返回结果。
    • 不适用于运行 Android 5.1.1 的三星 SM-J120F。
    猜你喜欢
    • 1970-01-01
    • 2018-10-13
    • 2020-01-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多