关于 that question 和 that question,如果使用 onKeyDown 和 onKeyLongPress,则需要在 onKeyDown 中使用 event.startTracking();
。但我使用 WebViews。
我该怎么做才能加入 onKeyDown 和 onKeyPress 而不会丢失 WebView 的返回功能?
我需要这种行为:
在网页 View 中,
* 当用户按下后退按钮时,webview 将返回历史记录
* 当用户长按返回键时,将调用 finish()
public boolean onKeyDown(int keyCode, KeyEvent event) {
if (keyCode == KeyEvent.KEYCODE_BACK) {
if(mWebView.canGoBack()) {
mWebView.goBack();
} else {
super.onBackPressed();
}
return true;
}
return super.onKeyDown(keyCode, event);
}
@Override
public boolean onKeyLongPress(int keyCode, KeyEvent event) {
if (keyCode == KeyEvent.KEYCODE_BACK)
{
finish();
return true;
}
return super.onKeyLongPress(keyCode, event);
}
最佳答案
您需要覆盖 onBackPressed()
方法而不是 onKeyDown()
,除非目标 SDK 设置为低于 Eclair,否则从 onKeyUp()
post-Eclair 调用该方法。从 true
返回 onKeyLongPress()
将导致事件被取消,并且不会调用 onBackPressed()
。
@Override
public void onBackPressed() {
if(mWebView.canGoBack()) {
mWebView.goBack();
} else {
super.onBackPressed();
}
}
@Override
public boolean onKeyLongPress(int keyCode, KeyEvent event) {
if (keyCode == KeyEvent.KEYCODE_BACK && event.isTracking()
&& !event.isCanceled() {
super.onBackPressed();
return true;
}
return false;
}
编辑: 实际上,您应该重写
onKeyUp()
方法来提供相同的体验,并在 onKeyLongPress()
调用上设置一个标志以检查它是否已被长按:private boolean isBackKeyLongPressed;
@Override
public boolean onKeyUp(int keyCode, KeyEvent event) {
if (keyCode == KeyEvent.KEYCODE_BACK && event.isTracking()
&& !event.isCanceled()) {
if (!isBackKeyLongPressed && mWebView.canGoBack()) {
mWebView.goBack();
} else {
onBackPressed();
}
isBackKeyLongPressed = false;
return true;
}
if (keyCode == KeyEvent.KEYCODE_BACK) {
isBackKeyLongPressed = false;
}
return super.onKeyUp(keyCode, event);
}
@Override
public boolean onKeyLongPress(int keyCode, KeyEvent event) {
if (keyCode == KeyEvent.KEYCODE_BACK && !event.isCanceled()) {
isBackKeyLongPressed = true;
}
return false;
}
关于webview存在时的Android onKeyLongPress,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/19883383/