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

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>

你好,请问你使用的 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手机,需要长按菜单键才会触发真正的菜单键。


https://issues.apache.org/jira/browse/CB-8921

【热门文章】
【热门文章】