2013-11-09 1 views
3

that questionthat question에 대해 onKeyDown 및 onKeyLongPress를 사용하는 경우 onKeyDown 내에 event.startTracking();을 사용해야합니다. 하지만 WebViews를 사용합니다.webview가있을 때 onKeyLongPress가

WebView의 백 기능을 잃지 않고 onKeyDown 및 onKeyPress에 가입하려면 어떻게해야합니까? 사용자 긴 프레스 키 백업하면, 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

당신은 목표 SDK는 에클 레어 이하로 설정되어 있지 않으면 onKeyUp() 후 에클 레어에서 호출 대신 onKeyDown()onBackPressed() 메소드를 오버라이드 (override) 할 필요가있다. 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() 메소드를 오버라이드 (override)하고, 오랫동안 눌렀는지 여부를 확인하기 위해 onKeyLongPress() 전화에 플래그를 설정해야합니다 : I 시도

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; 
} 
+0

길게 누름을 풀지 못함 – trante

+0

@trante : 편집 한 것처럼 onKeyLongPress()를 무시 했습니까? – corsair992

+0

예 onBackPressed와 onKeyLongPress가 함께 작동하지 않습니다. – trante

0

을 가지고
내부의 웹보기, 사용자가 버튼을 다시 누르면
는 *, 웹보기가 역사에 다시 갈 것입니다 :
나는이 동작을 필요로 봐봐 this 대답.

기본적으로 onTouchEvent의 핸들러를 사용하여 길게 누르기를 감지합니다.

희망이 있습니다.

+0

. 이 청취자는'''MotionEvent.ACTION_DOWN''',''''''MotionEvent.ACTION_MOVE''' 등을 캡쳐합니다. 그러나 캡쳐는하지 않습니다. (mySuperWebView.setOnTouchListener (new View.OnTouchListener() {''' – trante

관련 문제