【问题标题】:Read Keyboard events in Android WebView在 Android WebView 中读取键盘事件
【发布时间】:2012-07-11 09:45:21
【问题描述】:

我正在尝试在 android 网络视图中收听关键事件。例如,当用户填写表格时,我应该收到关键事件。这是我的 WebView 代码

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;
    }

    .....

}

当用户输入文本框或文本区域时,不会调用 onKeyDownonKeyUponKey 方法。是否有可能实现这一点,或者 Android 是否限制了这种可能侵犯隐私的行为?

【问题讨论】:

  • 你能让它工作吗?我现在有完全相同的问题...
  • 不,这种类型的操作被认为是不安全的,因为可以记录密码等。所以在android中是不允许的。

标签: android webview android-webview android-softkeyboard keyevent


【解决方案1】:

小心!此解决方案仅支持英文字母。

无需访问 HTML 源代码或 JS 事件即可完成。适用于我在 Android 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 的系统提供的输入实现。默认情况下,阻止开发人员访问事件是 Google 员工故意设置的。因为键事件输入不再是唯一的。有手势,声音和更多即将到来。官方建议是“完全停止依赖传统的键事件来输入文本”。在此处查看更多详细信息:https://code.google.com/p/android/issues/detail?id=42904#c15

【讨论】:

  • @PC。是的,当然。例如。如果加载到 WebView 中的页面类似于 google.com.ua ,您会在输入到文本框中的每个字母时收到通知。
  • 这可能会导致问题。因为您忽略了EditorInfo(带有InputType 信息),这可能会导致显示错误的键盘。例如。最后使用的键盘是数字,但用户单击文本字段时,会出现数字键盘(有趣的是,这仅在某些设备上发生,例如 HTC One M8)。我试图在 Enter 上隐藏键盘,我必须以不同的方式实现这一点 - 当 URL 即将加载时我隐藏了键盘 (webViewClient.shouldOverrideUrlLoading())。
【解决方案2】:

您可以在 WebViewClient 类上使用 onUnhandledKeyEvent() 函数覆盖。 非常适合我。

onUnhandledKeyEvent

@Override
public void onUnhandledKeyEvent(WebView view, KeyEvent event) {
      return;
}

whenever a user presses any key on the keyboard, this event will get fire.
Please let me know if that's works for you?

【讨论】:

  • 我需要知道是否有任何虚拟键盘事件到达我的 WebView 中的文本字段以用于不活动计时器,这非常有效。谢谢。
  • 注意:调用需要 API 级别 28。
【解决方案3】:

我发现了一种在 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)
            }
        }
    }

【讨论】:

    【解决方案4】:

    你可以像这样使用javascript

    <body>
        
        <div contenteditable="true" id='box'></div>
    </body>
        <script>
            box.addEventListener('keydown',e=>{
                if(e.keyCode ===13){
                    alert('pressed enter key')
                }
            })
        </script>

    【讨论】:

      【解决方案5】:

      我不知道您是否已经尝试过,但是...或者,您可以为您的“MyWebViewClass”启用 javascript,并使用 javascript 事件通过 webView.addJavascriptInterface(....etc) 调用 java 代码

      全文:-http://developer.android.com/guide/webapps/webview.html#BindingJavaScript

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-12-13
        • 2014-05-19
        • 2021-09-04
        • 1970-01-01
        • 2012-08-15
        • 2013-05-25
        • 1970-01-01
        • 2017-12-18
        相关资源
        最近更新 更多