我已经构建了一个 Android 应用程序,它在 WebView 中加载一个 html 页面,它工作正常,除了应该在方向键方向键上发生的操作不起作用这一事实。如果我用其他键改变箭头的 Action ,它就会起作用。在网络浏览器中加载 html 页面工作正常,PC 键盘箭头键返回正确的操作,但在 Android WebView 中,方向键箭头键不起作用。
这是我在 js 中按下老虎键的方式:
window.addEventListener('keydown', keyDownHandler, true);
function keyDownHandler(evt){
var keyCode=evt.keyCode;
alert(keyCode);
}
除箭头键外,按任何其他键都会返回键码,但箭头键不会。
这可能与此处重复:android WebView: Handle arrow keys in JavaScript但没有找到可行的解决方案。
有什么方法可以获取 Android WebView 中的方向键箭头键代码?
最佳答案
Google TV 示例中有一个名为 WebAppNativePlayback 的示例应用程序:https://code.google.com/p/googletv-android-samples/source/browse/#git%2FWebAppNativePlayback
本质上,d-pad 由 native 应用程序使用,因此您需要处理它,如果您使用全屏 WebView,则可以通过将其注入(inject) JS 将相关键传递给 WebView。
需要注意的主要代码有:
在Activity中,消费按键事件并向下传递:
/**
* This method will check if the key press should be handled by the system
* or if we have chosen to override it to pass to the WebView. In
* development builds of the application, the R key is used refresh the page
* (required to ensure cached versions of the page are not used)
*/
@Override
public boolean dispatchKeyEvent(KeyEvent event) {
if (mIsDevelopmentBuild && event.getKeyCode() == KeyEvent.KEYCODE_R) {
mWebViewFragment.refresh();
}
int eventKeyCode = event.getKeyCode();
for (int i = 0; i < mOverrideKeyCodes.length; i++) {
if (eventKeyCode == mOverrideKeyCodes[i]) {
if (event.getAction() == KeyEvent.ACTION_UP) {
mWebViewFragment.handleKeyInjection(eventKeyCode);
}
return true;
}
}
return super.dispatchKeyEvent(event);
}
覆盖键在哪里:
mOverrideKeyCodes = new int[] {
KeyEvent.KEYCODE_DPAD_CENTER,
KeyEvent.KEYCODE_DPAD_UP,
KeyEvent.KEYCODE_DPAD_LEFT,
KeyEvent.KEYCODE_DPAD_DOWN,
KeyEvent.KEYCODE_DPAD_RIGHT
};
在 webview 所在的 fragment 中(尽管这可能在您的 Activity 中):
/**
* Given a key code, this method will pass it into the web view to handle
* accordingly
*
* @param keycode Native Android KeyCode
*/
public void handleKeyInjection(int keycode) {
String jsSend = "javascript:androidKeyHandler.handleUri('nativewebsample://KEY_EVENT;"
+ keycode + ";');";
loadJavascriptAction(jsSend);
}
loadJavascriptAction 很简单
mWebView.loadUrl(jsSend);
然后在您的网页中,您需要设置一个可访问的方法或对象 - 在这种情况下,应用程序设置一个对象 window.androidKeyHandler
/**
* This method will set up any additional key handling (i.e. Android key handling)
* @function
*/
IndexPage.prototype.setUpKeyHandling = function () {
if(this.isEmbedded()) {
// We want the native app to access this
window.androidKeyHandler = new AndroidKeyHandler(this.getFocusController());
}
};
它比这样处理键:
/**
* Handle a keypress directly from the native app
* @function
* @param {int} keyCode The native Android key code
*/
AndroidKeyHandler.prototype.handleNativeKeyPress = function (keyCode) {
var focusController = this.getFocusController();
switch(parseInt(keyCode, 10)) {
case 23:
// DPAD Center
console.log("Native Enter");
if(focusController.getCurrentlyFocusedItem()) {
focusController.getCurrentlyFocusedItem().onItemClick();
}
break;
case 20:
// DPAD Down
console.log("Native Down Pressed");
focusController.moveFocus({x: 0, y: -1});
break;
case 21:
// DPAD Left
console.log("Native Left Pressed");
focusController.moveFocus({x: -1, y: 0});
break;
case 22:
// DPAD Right
console.log("Native RIGHT Pressed");
focusController.moveFocus({x: 1, y: 0});
break;
case 19:
// DPAD Up
console.log("Native UP Pressed");
focusController.moveFocus({x: 0, y: 1});
break;
default:
console.log("Keycode not registered");
break;
}
};
这个例子可能比它需要的要复杂得多,但如果你完成上面的每一部分并尝试一下,你应该不会遇到太多麻烦
关于android - 在 WebView Google TV 应用上处理方向键的方向键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19716840/
Rackup通过Rack的默认处理程序成功运行任何Rack应用程序。例如:classRackAppdefcall(environment)['200',{'Content-Type'=>'text/html'},["Helloworld"]]endendrunRackApp.new但是当最后一行更改为使用Rack的内置CGI处理程序时,rackup给出“NoMethodErrorat/undefinedmethod`call'fornil:NilClass”:Rack::Handler::CGI.runRackApp.newRack的其他内置处理程序也提出了同样的反对意见。例如Rack
我有一个这样的哈希数组:[{:foo=>2,:date=>Sat,01Sep2014},{:foo2=>2,:date=>Sat,02Sep2014},{:foo3=>3,:date=>Sat,01Sep2014},{:foo4=>4,:date=>Sat,03Sep2014},{:foo5=>5,:date=>Sat,02Sep2014}]如果:date相同,我想合并哈希值。我对上面数组的期望是:[{:foo=>2,:foo3=>3,:date=>Sat,01Sep2014},{:foo2=>2,:foo5=>5:date=>Sat,02Sep2014},{:foo4=>4,:dat
我有一个包含多个键的散列和一个字符串,该字符串不包含散列中的任何键或包含一个键。h={"k1"=>"v1","k2"=>"v2","k3"=>"v3"}s="thisisanexamplestringthatmightoccurwithakeysomewhereinthestringk1(withspecialcharacterslike(^&*$#@!^&&*))"检查s是否包含h中的任何键的最佳方法是什么,如果包含,则返回它包含的键的值?例如,对于上面的h和s的例子,输出应该是v1。编辑:只有字符串是用户定义的。哈希将始终相同。 最佳答案
最近因为项目需要,需要将Android手机系统自带的某个系统软件反编译并更改里面某个资源,并重新打包,签名生成新的自定义的apk,下面我来介绍一下我的实现过程。APK修改,分为以下几步:反编译解包,修改,重打包,修改签名等步骤。安卓apk修改准备工作1.系统配置好JavaJDK环境变量2.需要root权限的手机(针对系统自带apk,其他软件免root)3.Auto-Sign签名工具4.apktool工具安卓apk修改开始反编译本文拿Android系统里面的Settings.apk做demo,具体如何将apk获取出来在此就不过多介绍了,直接进入主题:按键win+R输入cmd,打开命令窗口,并将路
我对图像处理完全陌生。我对JPEG内部是什么以及它是如何工作一无所知。我想知道,是否可以在某处找到执行以下简单操作的ruby代码:打开jpeg文件。遍历每个像素并将其颜色设置为fx绿色。将结果写入另一个文件。我对如何使用ruby-vips库实现这一点特别感兴趣https://github.com/ender672/ruby-vips我的目标-学习如何使用ruby-vips执行基本的图像处理操作(Gamma校正、亮度、色调……)任何指向比“helloworld”更复杂的工作示例的链接——比如ruby-vips的github页面上的链接,我们将不胜感激!如果有ruby-
我有一个super简单的脚本,它几乎包含了FayeWebSocketGitHub页面上用于处理关闭连接的内容:ws=Faye::WebSocket::Client.new(url,nil,:headers=>headers)ws.on:opendo|event|p[:open]#sendpingcommand#sendtestcommand#ws.send({command:'test'}.to_json)endws.on:messagedo|event|#hereistheentrypointfordatacomingfromtheserver.pJSON.parse(event.d
我正在尝试解析网页,但有时会收到404错误。这是我用来获取网页的代码:result=Net::HTTP::getURI.parse(URI.escape(url))如何测试result是否为404错误代码? 最佳答案 像这样重写你的代码:uri=URI.parse(url)result=Net::HTTP.start(uri.host,uri.port){|http|http.get(uri.path)}putsresult.codeputsresult.body这将打印状态码和正文。
我查看了Stripedocumentationonerrors,但我仍然无法正确处理/重定向这些错误。基本上无论发生什么,我都希望他们返回到edit操作(通过edit_profile_path)并向他们显示一条消息(无论成功与否)。我在edit操作上有一个表单,它可以POST到update操作。使用有效的信用卡可以正常工作(费用在Stripe仪表板中)。我正在使用Stripe.js。classExtrasController5000,#amountincents:currency=>"usd",:card=>token,:description=>current_user.email)
这里我想输出带有动态组名的json而不是单词组@tickets.eachdo|group,v|json.group{json.array!vdo|ticket|json.partial!'tickets/ticket',ticket:ticketend}end@ticket是这样的散列{a:[....],b:[.....]}我想要这样的输出{a:[.....],b:[....]} 最佳答案 感谢@AntarrByrd,这个问题有类似的答案:JBuilderdynamickeysformodelattributes使用上面的逻辑我已经
当profile为nil时,总是让我感到悲伤...我该怎么办? 最佳答案 在View中使用变量之前,始终检查变量是否为nil。我确信这个问题有更优雅的解决方案,但这应该能让您入门。 关于ruby-on-rails-Rails处理.Erb与Nils,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/2709605/