Недавно я обновился до кордовы 5 и удалил/воссоздал платформу Android в версии 4.0.0 и удалил/переустановил все плагины.
Мне также пришлось обновить android sdk до sdk 22 вместо 21.
С момента обновления я больше не могу поймать событие menubutton, как описано в документации по cordova.
Как он все еще упоминается в документах edge, я предполагаю, что он все равно должен работать, и я ничего не видел об этом в примечаниях к выпуску.
Кнопканазад все еще работает.
Я попытался установить target-sdk в 19, он ничего не решил о проблеме.
Edit: Я выкопал исходный код кордовы и нашел в 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);
}
}
Ну, мой ответ будет "НЕ ДОЛЖЕН!!!!"
Кордова делает список кодов клавиш для обработки, но не добавляет кнопку меню, а затем код ключа сравнивается с KeyEvent.KEYCODE_MENU только после того, как код ключа был пропущен, потому что он отсутствует в списке.
Я попытался добавить кейс для кнопки меню, но оказывается, что функция вызывается только с кодом обратной кнопки.
Итак, теперь я знаю, почему это не работает, но все же не так, как это исправить.
Изменить 02/2016: В соответствии с последней версией Jira поддержка меню теперь фиксируется в java-части в Cordova Android 5.1.0, но все же не инициализируется из javascript. На данный момент, как указал пользователь Jira Кит Вонг, вам нужно добавить вызов javascript, прежде чем добавить слушателя событий:
document.addEventListener("deviceready", function() {
...
navigator.app.overrideButton("menubutton", true); // <-- Add this line
document.addEventListener("menubutton", yourCallbackFunction, false);
...
}, false);