2

onPageFinished以前は、Web ビューの履歴を追跡するために使用していました。

@Override
public void onPageFinished(WebView view, String url) {
    super.onPageFinished(view, url);
    if ("about:blank".equals(url) && view.getTag() != null){
        view.loadUrl(view.getTag().toString());
    }else{ 
        view.setTag(url);
    }
}

今、試しview.goBack()てみると、目的のページではなく、about:blank に戻ります。

その「about:blank」URL を WebView 履歴に入れるように設定して、戻ったときに再び表示されないようにするにはどうすればよいですか。view.clearHistory()しかし、すべての履歴が削除されるため、必要ありません。

4

3 に答える 3

7

最初の非about:blankが見つかるまで履歴をさかのぼりたいと仮定すると、その 方法は次のとおりです。

あなたの活動で

 public void goBackInWebView(){
    WebBackForwardList history = webView.copyBackForwardList();
    int index = -1;
    String url = null;

    while (webView.canGoBackOrForward(index)) {
          if (!history.getItemAtIndex(history.getCurrentIndex() + index).getUrl().equals("about:blank")) {
             webView.goBackOrForward(index);
             url = history.getItemAtIndex(-index).getUrl();
             Log.e("tag","first non empty" + url);
             break;
           }
           index --;

    }
   // no history found that is not empty
   if (url == null) {
      finish();
   }

}

コード ロジックは、前のすべてのページをループ スローすることです。そして最初に空のページがロードされません。何も見つからない場合は、アプリを終了します。

于 2013-03-10T12:14:51.217 に答える
0

@Mr.Meの答えは、OnKeyListenerとして少し優れていることがわかりました

public class BackButtonListener implements View.OnKeyListener {

    @Override
    public boolean onKey(View v, int keyCode, KeyEvent event) {
        if (event.getAction() == KeyEvent.ACTION_DOWN) {
            WebView webView = (WebView) v;

            switch (keyCode) {
                case KeyEvent.KEYCODE_BACK:
                    WebBackForwardList backstack = webView.copyBackForwardList();
                    int currentIndex = backstack.getCurrentIndex();
                    int i = -1;
                    while (webView.canGoBackOrForward(i)) {
                        if (!backstack.getItemAtIndex(currentIndex + i).getUrl().equals("about:blank")) {
                            webView.goBackOrForward(i);
                            return true;
                        }
                        i--;
                    }
                    webView.goBack();
                    return true;
            }
        }
        return false;
    }
}

次のように設定しました:

mWebView.setOnKeyListener(new BackButtonListener());
于 2015-02-11T00:44:45.560 に答える
0

履歴スタックを直接編集する方法はわかりませんが、何かを作ることができるかもしれませんshouldOverrideUrlLoading()

WebViewのドキュメントから:

WebView には、独自の動作を追加できるいくつかのカスタマイズ ポイントがあります。これらは:

...

WebViewClient サブクラスの作成と設定。エラーやフォームの送信など、コンテンツのレンダリングに影響を与えることが発生したときに呼び出されます。ここで URL の読み込みをインターセプトすることもできます(shouldOverrideUrlLoading() を使用)。

于 2013-03-10T11:23:36.880 に答える