关于 that questionthat 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/

10-12 05:56