3

その質問その質問に関して、onKeyDown と onKeyLongPress を使用する場合は、onKeyDownevent.startTracking();内で使用する必要があります。しかし、私はWebViewを使用しています。

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);
}
4

2 に答える 2

2

onBackPressed()の代わりにメソッドをオーバーライドする必要があります。これは、ターゲット SDK が Eclair より低く設定されていない限り、post-EclaironKeyDown()から呼び出されます。からonKeyUp()戻るとイベントがキャンセルされ、呼び出されません。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()代わりにメソッドをオーバーライドして同じエクスペリエンスを提供し、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;
}
于 2014-01-14T17:43:30.117 に答える