我最近升级到了Cordova 5,并在版本4.0.0中删除/重新创建了Android平台,卸载/重新安装了所有插件。
我还不得不将Android SDK升级到sdk 22而不是21。
自从升级以来,我无法像 cordova文档中描述的那样捕获menubutton事件。
由于它在最新版本的文档中仍然被引用,我认为它应该仍然有效,而且在发布说明中也没有关于此问题的说明。
返回按钮仍然可以正常工作。
我尝试将target-sdk设置为19,但并没有解决这个问题。
编辑: 我深入挖掘了Cordova源代码,在CordovaWebViewImpl.java中找到了一个可疑的TODO注释:
public void setButtonPlumbedToJs(int keyCode, boolean override) {
switch (keyCode) {
case KeyEvent.KEYCODE_VOLUME_DOWN:
case KeyEvent.KEYCODE_VOLUME_UP:
case KeyEvent.KEYCODE_BACK:
// TODO: Why are search and menu buttons handled separately?
if (override) {
boundKeyCodes.add(keyCode);
} else {
boundKeyCodes.remove(keyCode);
}
return;
default:
throw new IllegalArgumentException("Unsupported keycode: " + keyCode);
}
}
好的,我的回答是“它不应该这样!”
Cordova列出了处理按键代码的列表,但没有添加菜单按钮,之后将按键代码与KeyEvent.KEYCODE_MENU进行比较,只有在跳过按键代码后才会进行比较,因为它不在列表中。
我尝试添加菜单按钮的情况,但结果发现该函数仅使用返回按钮的代码调用。
所以现在我知道为什么它不起作用,但还不知道如何修复它。
编辑02/2016: 根据最新的Jira,菜单按钮的支持现在已在Cordova Android 5.1.0的Java部分中得到修复,但仍未从JavaScript初始化。 目前,如Jira用户Keith Wong所指示,您需要在添加事件侦听器之前添加JavaScript调用:
document.addEventListener("deviceready", function() {
...
navigator.app.overrideButton("menubutton", true); // <-- Add this line
document.addEventListener("menubutton", yourCallbackFunction, false);
...
}, false);
navigator.app.overrideButton("menubutton", true);
就可以让它工作了。 - QuickFix