gpt4 book ai didi

android - 升级到 cordova 5+cordova android 4.0.0 后,菜单按钮不再工作

转载 作者:塔克拉玛干 更新时间:2023-11-02 07:47:26 26 4
gpt4 key购买 nike

我最近升级到 cordova 5 并在版本 4.0.0 中删除/重新创建了 android 平台并卸载/重新安装了所有插件。

我还必须将 android sdk 升级到 sdk 22 而不是 21。

自从更新后,我无法再捕捉 the cordova documentation 中描述的 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 进行比较,因为它不在列表中。

我试图为菜单按钮添加一个 case,但事实证明该函数仅使用后退按钮的代码调用。

所以现在我知道为什么它不起作用,但仍然不知道如何修复它。

编辑 02/2016:根据 latest Jira , menubutton 的支持现在在 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);

最佳答案

clarent 的回答没有帮我做,菜单按钮仍然没有响应。

我尝试了几个补丁,另一个完全禁用 boundKeyCodes 检查的建议也没有这样做,因为这样后退按钮的行为就会受到影响。

恢复旧行为的简洁方法应该如下所示。boundKeyCodes 检查确保自定义行为仅在实际存在绑定(bind)到事件的自定义事件处理程序时执行。但是,将事件处理程序绑定(bind)到应用程序 JS 代码中的“menubutton”不会再触发将 menubutton 键代码添加到 boundKeyCodes 列表中。这是因为 setButtonPlumbedToJs 方法从一开始就不会为“菜单按钮”处理程序执行,即使它会执行,此方法中的 switch 语句也不会处理 KEYCODE_MENU。

您可以很容易地恢复该行为,首先您必须应用 clarent 建议的更改:

  1. 处理 KEYCODE_MENU

在 CordovaLib/src/org/apache/cordova/CoreAndroid.java(大约第 357 行,setButtonPlumbedToJs)中,在 KEYCODE_BACK 条目之后添加一个 case 语句,如下所示:

public void setButtonPlumbedToJs(int keyCode, boolean override) {
switch (keyCode) {
case KeyEvent.KEYCODE_VOLUME_DOWN:
case KeyEvent.KEYCODE_VOLUME_UP:
case KeyEvent.KEYCODE_BACK:
case KeyEvent.KEYCODE_MENU:
// 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);
}
}

然后确保 setButtonPlumbedToJs 实际得到执行。为此,您还需要进行两项更改。

  1. 添加框架处理程序

在 CordovaLib/src/org/apache/cordova/CoreAndroid.java 中(大约第 243 行,overrideButton)使方法看起来像这样(添加最后一个 else-if 子句):

public void overrideButton(String button, boolean override) {

if (button.equals("volumeup")) {
webView.setButtonPlumbedToJs(KeyEvent.KEYCODE_VOLUME_UP, override);
}
else if (button.equals("volumedown")) {
webView.setButtonPlumbedToJs(KeyEvent.KEYCODE_VOLUME_DOWN, override);
}
else if (button.equals("menubutton")) {
webView.setButtonPlumbedToJs(KeyEvent.KEYCODE_MENU, override);
}
}
  1. 添加 javascript 处理程序调用

在 platform_www/cordova.js(大约 1532 行, Bootstrap )中更改此行:

cordova.addDocumentEventHandler('menubutton');

为此:

var menuButtonChannel = cordova.addDocumentEventHandler('menubutton');
menuButtonChannel.onHasSubscribersChange = function() {
exec(null, null, APP_PLUGIN_NAME, "overrideButton", ['menubutton', this.numHandlers == 1]);
};

一旦将事件处理程序添加到“menubutton”,这将触发框架的 overrideButton 方法。

应该可以了。我还添加了这个解决方案作为评论 https://issues.apache.org/jira/browse/CB-8921并且可能很快会提交拉取请求。

关于android - 升级到 cordova 5+cordova android 4.0.0 后,菜单按钮不再工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30309354/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com