WebView onKeyListener 不工作

WebView onKeyListener not working

我必须拦截屏幕上的触摸,这是我的代码:

    mWebView = findViewById(R.id.webview);
    mWebView.setWebViewClient(new WebViewClient());
    mWebView.loadUrl(URL);
    mWebView.setOnTouchListener(this);
    mWebView.setOnKeyListener(this);

和我的听众:

@Override
public boolean onTouch(View view, MotionEvent motionEvent) {
    if (motionEvent.getAction() == MotionEvent.ACTION_DOWN) {
        Log.i(TAG, "Hello, touch.");
        onTouchEvent();
        return false;
    }
    return false;
}

@Override
public boolean onKey(View view, int i, KeyEvent keyEvent)
{
    Log.i(TAG, "Hello, onKey.");
    onTouchEvent();
    return false;
}

虽然 on touch 对于屏幕上的触摸工作正常,但它不会拦截键盘上的触摸事件。为此,我添加了 onkeylistener,但它并没有拦截按键事件。最后一点,我不关心输入的内容,只关心是否触摸了屏幕。

根据我最近在 setWebViewClient() 之前调用 loadUrl() 的莫名其妙和不一致行为的经验,我会尝试在设置任何与多线程 WebView 相关的内容之后调用 loadUrl()。这包括 setOnTouchListener() 和 setOnKeyListener()。 我意识到我的回答可能对您的具体问题没有帮助 - 但它可能会帮助其他经历过类似行为并且在调用 loadUrl() 之前进行设置的人。

如果您想检测按键,请尝试覆盖

onKeyPreIme(int keyCode, KeyEvent event);

为什么不尝试 onkeyDown

 @Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
    if(event.getAction() == KeyEvent.ACTION_DOWN){
        switch(keyCode)
        {
        case KeyEvent.KEYCODE_BACK:
            if(webView.canGoBack()){
                webView.goBack();
            }else{
                finish();
            }
            return true;
        }

    }
    return super.onKeyDown(keyCode, event);
}

覆盖这个方法 --> onUnhandledKeyEvent (WebView view, KeyEvent 事件)

更多详情:

https://developer.android.com/reference/android/webkit/WebViewClient.html#onUnhandledKeyEvent(android.webkit.WebView,%20android.view.KeyEvent)

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

注意:-

Google 员工故意阻止开发者默认访问事件。因为按键事件输入不再是唯一的。有手势、声音等等。官方建议是“完全停止依赖遗留键事件进行文本输入”。在此处查看更多详细信息:https://code.google.com/p/android/issues/detail?id=42904#c15