2013-03-10 105 views
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”url以便放入webview历史记录中,以便当我返回时我不会再看到它。但我不想view.clearHistory(),因为它删除所有的历史。

回答

7

那么假设你想回去的历史,直到找到第一个非约:空白 这里是如何做到这一点:

您的活动

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

}

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

+0

非常感谢您的回答! – Nass 2013-03-10 13:18:25

+0

谢谢,最佳答案。 – exshinigami 2017-07-01 09:50:56

0

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

东西从WebView文档:

网页视图有几个定制点在那里你可以添加你自己的行为。它们是:

...

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

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());