如何仅在webview历史记录中返回非空白页面?

时间:2013-03-10 10:50:42

标签: android android-webview

我曾经使用onPageFinished来跟踪网络视图的历史记录:

@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”url以便将其放入webview历史记录中,以便当我回去时我不会再看到它。但我不想要view.clearHistory(),因为它会删除所有历史记录。

3 个答案:

答案 0 :(得分: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();
   }

}

代码逻辑是循环抛出所有以前的页面。并且首先没有空页加载它。 如果没有找到任何完成应用程序。

答案 1 :(得分:0)

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

来制作一些东西。

来自WebView文档:

  

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

     

...

     

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

答案 2 :(得分: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());