3

关于那个问题那个问题,如果你使用 onKeyDown 和 onKeyLongPress 需要event.startTracking();在 onKeyDown 内部使用。但我使用 WebViews。

怎样才能加入 onKeyDown 和 onKeyPress 而不会失去 WebView 的后退功能?
我需要这种行为:
在 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);
}
4

2 回答 2

2

除非目标 SDK 设置为低于 Eclair,否则您需要重写从 Eclair 后调用的onBackPressed()方法而不是。从返回将导致事件被取消,并且不会被调用。onKeyDown()onKeyUp()trueonKeyLongPress()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;
}
于 2014-01-14T17:43:30.117 回答
0

看看这个答案。

基本上,您使用处理程序onTouchEvent来检测长按。

希望能帮助到你!

于 2014-01-10T22:32:48.397 回答