在Android WebView中读取键盘事件
我正在尝试在android web view中收听关键事件。例如,当用户填写表单时,我应该收到关键事件。这是我的WebView代码在Android WebView中读取键盘事件,android,webview,android-webview,android-softkeyboard,keyevent,Android,Webview,Android Webview,Android Softkeyboard,Keyevent,我正在尝试在android web view中收听关键事件。例如,当用户填写表单时,我应该收到关键事件。这是我的WebView代码 public class MyWebView extends WebView implements OnKeyListener { ..... @Override public boolean onKeyDown(int keyCode, KeyEvent event) { Log.i("PcWebView", "o
public class MyWebView extends WebView implements OnKeyListener
{
.....
@Override
public boolean onKeyDown(int keyCode, KeyEvent event)
{
Log.i("PcWebView", "onKeyDown keyCode=" + keyCode);
return super.onKeyDown(keyCode, event);
}
@Override
public boolean onKeyUp(int keyCode, KeyEvent event)
{
Log.i("PcWebView", "onKeyUp keyCode=" + keyCode);
return super.onKeyUp(keyCode, event);
}
@Override // Listener is initialized in the constructor
public boolean onKey(View v, int keyCode, KeyEvent event)
{
Log.i("PcWebView", "onKey keyCode=" + keyCode);
return false;
}
.....
}
当用户在文本框或文本区域中键入内容时,不会调用
onKeyDown
、onkeydup
和onKey
方法。是否有可能实现这一点,或者Android限制了这一点,因为可能会侵犯隐私?我不知道您是否已经尝试过这一点,但是……或者,您可以为“MyWebViewClass”启用javascript,并使用javascript事件调用java代码,使用完整故事:-小心!此解决方案仅支持英文字母。 无需访问HTML源代码或JS事件即可完成。适用于我在安卓5.0.2上的软键盘和硬件键盘
public class MyWebView extends WebView {
@Override
public InputConnection onCreateInputConnection(EditorInfo outAttrs) {
return new BaseInputConnection(this, false); //this is needed for #dispatchKeyEvent() to be notified.
}
@Override
public boolean dispatchKeyEvent(KeyEvent event) {
boolean dispatchFirst = super.dispatchKeyEvent(event);
// Listening here for whatever key events you need
if (event.getAction() == KeyEvent.ACTION_UP)
switch (event.getKeyCode()) {
case KeyEvent.KEYCODE_SPACE:
case KeyEvent.KEYCODE_ENTER:
// e.g. get space and enter events here
break;
}
return dispatchFirst;
}
}
这里的诀窍是用简化的输入实现覆盖系统提供的
InputConnection
。谷歌故意阻止开发人员默认访问事件。因为键事件输入不再是唯一的输入。这里有手势,声音,还有更多的东西。官方建议“完全停止依赖遗留的关键事件来输入文本”。查看此处的更多详细信息:您可以在WebViewClient类上使用onUnhandledKeyEvent()函数重写。
对我来说很合适
您可以像这样使用javascript
box.addEventListener('keydown',e=>{
如果(如keyCode===13){
警报('按下回车键')
}
})
我在Kotlin中找到了一种简单的方法,可以通过JavaScript回调实现这一点
webview.apply {
settings.javaScriptEnabled = true
addJavascriptInterface(object {
@JavascriptInterface
fun keyInteraction(): Boolean {
//<handle key interaction here>
return true
}
},"Android")
webViewClient = object : WebViewClient() {
override fun onPageFinished(view: WebView?, url: String?) {
loadingFinished()
view?.loadUrl(
"javascript:(function() {" +
" window.parent.addEventListener (" +
" 'keyup'," +
" function(event) {" +
" Android.keyInteraction();" +
" });" +
"})()"
)
super.onPageFinished(view, url)
}
}
}
webview.apply{
settings.javaScriptEnabled=true
addJavascriptInterface(对象{
@JavascriptInterface
fun keyInteraction():布尔值{
//
返回真值
}
}“安卓系统”)
webViewClient=对象:webViewClient(){
覆盖乐趣onPageFinished(视图:WebView?,url:字符串?){
加载完成()
查看?.loadUrl(
“javascript:(函数(){”+
“window.parent.addEventListener(”+
“‘键控’,”+
“函数(事件){”+
“Android.keyInteraction();”+
" });" +
"})()"
)
super.onPageFinished(视图、url)
}
}
}
您能让它工作吗?我现在有完全相同的问题…不,这种类型的操作被认为是不安全的,因为可以记录密码等。所以在android中是不允许的。@PC。是的,当然可以。例如,如果加载到WebView中的页面类似于,则在文本框中输入的每个字母都会通知您。这可能会导致问题。由于忽略了EditorInfo
(其中包含InputType
信息),因此可能会导致显示错误的键盘。上次使用的键盘是数字键盘,但用户点击文本字段,数字键盘就会出现(有趣的是,这只发生在某些设备上,如HTC One M8)。我试图在Enter键上隐藏键盘,我必须以另一种方式实现这一点-我在URL即将加载时隐藏了键盘(webViewClient.shouldOverrideUrlLoading()
)。我需要知道是否有任何虚拟键盘事件到达我的WebView中的文本字段中,用于非活动计时器,这非常有效。谢谢。注意:调用需要API级别28。不,这在Android 11上不起作用
webview.apply {
settings.javaScriptEnabled = true
addJavascriptInterface(object {
@JavascriptInterface
fun keyInteraction(): Boolean {
//<handle key interaction here>
return true
}
},"Android")
webViewClient = object : WebViewClient() {
override fun onPageFinished(view: WebView?, url: String?) {
loadingFinished()
view?.loadUrl(
"javascript:(function() {" +
" window.parent.addEventListener (" +
" 'keyup'," +
" function(event) {" +
" Android.keyInteraction();" +
" });" +
"})()"
)
super.onPageFinished(view, url)
}
}
}