【问题标题】:Android onKeyLongPress when webview exists存在webview时的Android onKeyLongPress
【发布时间】:2013-11-21 21:34:21
【问题描述】:

关于that questionthat question,如果你使用onKeyDown和onKeyLongPress,需要在onKeyDown里面使用event.startTracking();。但我使用 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);
}

【问题讨论】:

    标签: android webview onkeydown


    【解决方案1】:

    您需要覆盖onBackPressed() 方法而不是onKeyDown(),除非目标SDK 设置为低于Eclair,否则该方法在Eclair 后从onKeyUp() 调用。从onKeyLongPress()返回true会导致事件被取消,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;
    }
    

    【讨论】:

    • @trante:您是否覆盖了onKeyLongPress(),如我的编辑所示?
    • @trante:您能否确认您的清单中的 targetSdkVersion 设置为 5 或更高。否则应该调用onKeyLongPress() 方法。它在 Galaxy S2 设备上为我工作。
    • 我检查了您上次编辑的内容。奇迹般有效。谢谢。
    【解决方案2】:

    看看this的答案。

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

    希望对你有帮助!

    【讨论】:

    • 我试过了。我添加了mySuperWebView.setOnTouchListener(new View.OnTouchListener() {。此侦听器捕获MotionEvent.ACTION_DOWNMotionEvent.ACTION_MOVE 等。但它不会捕获带有MotionEvent.BUTTON_BACK 的后退按钮按下。所以没用。
    猜你喜欢
    • 1970-01-01
    • 2012-10-08
    • 2018-02-28
    • 2011-12-29
    • 2012-02-26
    • 2022-01-05
    • 2011-04-16
    • 1970-01-01
    相关资源
    最近更新 更多