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 事件)
更多详情:
或
@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
我必须拦截屏幕上的触摸,这是我的代码:
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 事件)
更多详情:
或
@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