关于that question和that question,如果使用onKeyDown和onKeyLongPress,则需要在onKeyDown中使用event.startTracking();
。但我使用WebViews。
在不丢失WebView的后退功能的同时,如何加入onKeyDown和onKeyPress?
我需要这种行为:
内部webview,
*当用户按下后退按钮时,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);
}
答案 0 :(得分:2)
除非将目标SDK设置为低于Eclair,否则您需要覆盖onBackPressed()
方法,而不是onKeyDown()
来自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;
}
答案 1 :(得分:0)