- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我最近升级到 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 建议的更改:
在 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 实际得到执行。为此,您还需要进行两项更改。
在 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);
}
}
在 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/
我使用plugman命令在cordova中创建了一个插件 它创建了所有必需的文件。然后我在插件中添加了android平台。 然后我尝试将它添加到 cordova 应用程序中。我成功添加了它,但是当我尝
我使用plugman命令在cordova中创建了一个插件 它创建了所有必需的文件。然后我在插件中添加了android平台。 然后我尝试将它添加到 cordova 应用程序中。我成功添加了它,但是当我尝
我正在尝试在较旧的 Atrix 上安装一个应用程序,在 S3 上运行良好。搜索论坛可能的问题是SDK版本较高(Atrix是4.0.4)。修复显然是在设置 API 级别。 但是当我运行 cordova
使用 cordova build在一个为期一年的项目中提出: :processDebugResources my_project/platforms/android/build/intermediat
我有一个可以创建文件的可运行应用程序。 我正在寻找一种工作后数小时从cordova应用程序中删除文件的方法。我似乎无法使其正常工作。 这是用于创建和删除文件的代码: function crea
有什么区别吗Cordova 构建 Android 和 Cordova 准备 Android 命令? Reference is added here 最佳答案 准备将您的 www Assets 和任何插
我检查了文档,但没有找到关于此命令的明确说明。 那么,有谁知道cordova prepare命令的作用是什么? 是否更新特定于平台的www文件夹? 如果是,它将复制根www的全部内容吗? 它会更新平台
我们正在开发正在使用Cordova(专用于Ionic)的移动应用程序,并且正在使用PhoneGap PushPlugin和Amazon SNS进行推送通知。反过来,这会撞到我们与Amazon SNS进
我正在使用Vue,Webpack和Cordova。 Videos 如果我在没有Cordova的情况下加载页面,并且在Firefox浏览器中,则可以使用Youtube视频上的全屏图
因此,我尝试在我的(正在运行的)Ionic应用程序中安装一个新插件,该文件名为https://ionicframework.com/docs/native/firebase-dynamic-links
我像这样安装了cordova: C:\Windows\system32>npm install -g cordova 我明白了: C:\Users\cyril\AppData\Roaming\npm\
我有一个 cordova 应用程序,我使用以下代码捕获了后退按钮: document.addEventListener("backbutton", function (e) { bac
如何在 Cordova 中的蓝牙设备和 Android/iOS 之间发送和接收一系列数据字节? 我的项目的详细信息: 我正在开发一个蓝牙传感器设备。设备以一系列字节的形式发送数据。它还对设备 API
我是 cordova 开发的新手。我使用 Onsen UI (1.2.1) 作为布局框架。ons-toolbar 上的标题有问题。 someTextHere 如果我在 ripple 上运行
我有一个启用了平台浏览器的 Cordova 应用程序。我想在 Chrome 中使用摄像头,但调用摄像头根本没有任何反馈。它在我的 Android 设备上就像一个魅力。 我通过这个命令启动:cordov
我对thid docs https://firebase.google.com/docs/android/setup#available_libraries中提到的根级和应用程序级的路径目录感到困惑
喜欢这些插件 https://github.com/ArchieGoodwin/SilentShot https://github.com/alongubkin/phonertc 他们没有 tarba
我有一个 Angular 2 应用程序,我正在将其构建到 cordova 中并部署到 Android/IOS。我没有使用 ionic,我见过许多使用 ionic 的解决方案,但我现在无法将整个项目转换
当我发出命令时,在带有 Cordova 的 Ionic 3 中: ionic cordova run android --emulate 它给出以下消息: BUILD FAILED in 3s
我无法在 ionic 5.2.4v 中安装软件包 cordova-res 并收到以下错误。 命令:cordova-res C:\hanu\cordova-res-master\cordova-res
我是一名优秀的程序员,十分优秀!