Android onKeyLongPress when there is a webview

Regarding this question and this question , if you use onKeyDown and onKeyLongPress, you need to use event.startTracking(); inside onKeyDown. But I use WebViews.

What can I do to join KeyDown and onKeyPress without losing the WebView return function?
I need this behavior:
Inside webview,
* When the user clicks the back button, the web view will return to history
* When the user long presses the return button, finish() will be called

 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); } 
+3
android webview onkeydown
source share
2 answers

You need to override the onBackPressed() method instead of onKeyDown() , which is called from onKeyUp() post-Eclair if the target SDK is not set below Eclair. Returning true from onKeyLongPress() will cause the event to be canceled and onBackPressed() not to be called.

 @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; } 

Edit: Actually, you should override the onKeyUp() method instead to provide the same experience, and set the flag in the onKeyLongPress() call to check if it has been pressed long:

 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; } 
+2
source share

Take a look at this answer.

Basically you use a handler in onTouchEvent to detect a long press.

Hope this helps!

0
source share

All Articles