测试中同时绑定了音量键与返回键,都可以用,唯独菜单键不能用
<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