14

我正在尝试在 android web 视图中收听关键事件。例如,当用户填写表格时,我应该收到关键事件。这是我的 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;
    }

    .....

}

这两种方法都没有onKeyDownonKeyUp并且onKey在用户输入文本框或文本区域时被调用。是否有可能实现这一目标,或者 Android 是否限制了这种可能违反隐私的行为?

4

5 回答 5

14

警告!此解决方案仅支持英文字母。

无需访问 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

于 2015-04-15T11:38:25.060 回答
7

您可以在 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?
于 2017-04-06T15:52:03.303 回答
1

我在 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)
            }
        }
    }
于 2021-04-02T17:04:12.783 回答
0

你可以像这样使用javascript

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

于 2020-03-15T09:33:24.950 回答
-2

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

完整故事:- http: //developer.android.com/guide/webapps/webview.html#BindingJavaScript

于 2013-06-19T03:12:56.793 回答