cordova 注册事件 menubutton 监听器后无法绑定手机菜单键?

测试中同时绑定了音量键与返回键,都可以用,唯独菜单键不能用

 <script type="text/javascript" charset="utf-8">
                var num = 0;
    // Wait for device API libraries to load
    //
    function onLoad() {
        document.addEventListener("deviceready", onDeviceReady, false);
    }

    // device APIs are available
    //
    function onDeviceReady() {
        // Register the event listener
        document.addEventListener("menubutton", test, false);
        document.addEventListener("backbutton", eventBackButton, false);
        document.addEventListener("volumeupbutton", test, false);
        document.addEventListener("volumedownbutton", test, false);
    }

    // Handle the menu button
    //
    function test(){
                        alert("start");
    }

                function eventBackButton(){
    };

                onLoad();
    </script>
阅读 2.8k
评论 2016-03-19 提问
    2 个回答
    lagel
    • 189

    你好,请问你使用的 cordova 版本是多少。

    在 Android 的 cordovaLib 库里面的 CordovaWebViewImpl 里面有如下一段代码:

     @Override
    public Boolean onDispatchKeyEvent(KeyEvent event) {
        int keyCode = event.getKeyCode();
        Log.e("Keyboard", keyCode + " , " + KeyEvent.KEYCODE_MENU);
        boolean isBackButton = keyCode == KeyEvent.KEYCODE_BACK;
        if (event.getAction() == KeyEvent.ACTION_DOWN) {
            if (isBackButton && mCustomView != null) {
                return true;
            } else if (boundKeyCodes.contains(keyCode)) {
                return true;
            } else if (isBackButton) {
                return engine.canGoBack();
            }
        } else if (event.getAction() == KeyEvent.ACTION_UP) {
            if (isBackButton && mCustomView != null) {
                hideCustomView();
                return true;
            } else if (boundKeyCodes.contains(keyCode)) {
                String eventName = null;
                switch (keyCode) {
                    case KeyEvent.KEYCODE_VOLUME_DOWN:
                        eventName = "volumedownbutton";
                        break;
                    case KeyEvent.KEYCODE_VOLUME_UP:
                        eventName = "volumeupbutton";
                        break;
                    case KeyEvent.KEYCODE_SEARCH:
                        eventName = "searchbutton";
                        break;
                    case KeyEvent.KEYCODE_MENU:
                        eventName = "menubutton";
                        break;
                    case KeyEvent.KEYCODE_BACK:
                        eventName = "backbutton";
                        break;
                }
                if (eventName != null) {
                    sendJavascriptEvent(eventName);
                    return true;
                }
            } else if (isBackButton) {
                return engine.goBack();
            }
        }
        return null;
    }

    这里的 Log.e 是我添加上去了,为了方便调试我们所触发的按钮事件是否对应上。

    从这里我们可以看出,cordova 是实现了对 menubutton 事件的监听的,如果没能触发回调函数,可能是因为手机的差异出现问题,比如说 小米2手机,需要长按菜单键才会触发真正的菜单键。

    评论 赞赏 2016-04-20
      评论 赞赏 2016-04-19
        撰写回答

        登录后参与交流、获取后续更新提醒