2

我曾经用来onPageFinished跟踪 webview 历史记录:

@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”网址以便放入 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

我不知道直接编辑历史堆栈的方法,但你也许可以用shouldOverrideUrlLoading()

WebView文档:

WebView 有几个自定义点,您可以在其中添加自己的行为。这些都是:

...

创建和设置 WebViewClient 子类。当发生影响内容呈现的事情时(例如,错误或表单提交)将调用它。您还可以在此处拦截 URL 加载(通过 shouldOverrideUrlLoading())。

于 2013-03-10T11:23:36.880 回答
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 回答