简体   繁体   English

WebView onKeyListener 不起作用

[英]WebView onKeyListener not working

I have to intercept the touch on the screen, and this is my code:我必须拦截屏幕上的触摸,这是我的代码:

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

and my listeners:和我的听众:

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

While the on touch is working fine for touches on the screen, it dosen't intercept the touch event on the keyboard.虽然 on touch 对于屏幕上的触摸工作正常,但它不会拦截键盘上的触摸事件。 For this reason, I've added the onkeylistener, but it's not intercepting the key events.出于这个原因,我添加了 onkeylistener,但它没有拦截关键事件。 As last thing, I don't care about what is typed, but just if the screen has been touched.最后一件事,我不在乎输入了什么,而只关心屏幕是否被触摸过。

why not trying onkeyDown ?为什么不尝试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或者

override this method --> onUnhandledKeyEvent (WebView view, KeyEvent event)覆盖此方法 --> onUnhandledKeyEvent(WebView 视图,KeyEvent 事件)

more details on:更多详情:

https://developer.android.com/reference/android/webkit/WebViewClient.html#onUnhandledKeyEvent(android.webkit.WebView,%20android.view.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;
}

NOTE:-笔记:-

Preventing developers from accessing the events by default was made by Googlers on purpose.默认情况下,阻止开发人员访问这些事件是 Google 员工有意设计的。 Because the key event input isn't the only one anymore.因为键事件输入不再是唯一的了。 There're gestures, voice and more is coming.有手势、声音等等。 Official recommendation is to "stop relying on legacy key events for text entry at all".官方建议是“完全停止依赖遗留关键事件进行文本输入”。 Check out more details here: https://code.google.com/p/android/issues/detail?id=42904#c15在此处查看更多详细信息: https : //code.google.com/p/android/issues/detail?id=42904#c15

With my recent experience of inexplicable and inconsistent behaviour of calling loadUrl() before setWebViewClient() I would try calling loadUrl() AFTER setting ANYTHING to do with a multi-threaded WebView.根据我最近在 setWebViewClient() 之前调用 loadUrl() 的莫名其妙和不一致行为的经历,我会尝试在设置与多线程 WebView 相关的任何事情之后调用 loadUrl()。 That includes setOnTouchListener() and setOnKeyListener().这包括 setOnTouchListener() 和 setOnKeyListener()。 I realise my answer might not help your specific problem - but it might help others who have experienced similar behaviour and are setting things before before calling loadUrl().我意识到我的回答可能对您的具体问题没有帮助 - 但它可能会帮助其他经历过类似行为并在调用 loadUrl() 之前进行设置的人。

如果你想检测按键然后尝试覆盖

onKeyPreIme(int keyCode, KeyEvent event);

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM