当webview存在时,Android onKeyLongPress

时间:2013-11-09 21:34:38

标签: android webview onkeydown

关于that questionthat 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);
}

2 个答案:

答案 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)

看看this回答。

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

希望它有所帮助!