WebView onKeyListener不起作用

时间:2018-06-26 08:43:01

标签: android android-webview

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

    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可以很好地在屏幕上进行触摸,但它不会拦截键盘上的touch事件。因此,我添加了onkeylistener,但它没有拦截关键事件。最后,我不在乎键入的内容,而只是在触摸屏幕的情况下。

3 个答案:

答案 0 :(得分:3)

为什么不尝试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);
}

OR

覆盖此方法-> onUnhandledKeyEvent(WebView视图, KeyEvent事件)

更多详细信息:

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

OR

@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

答案 1 :(得分:0)

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

答案 2 :(得分:0)

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

onKeyPreIme(int keyCode, KeyEvent event);