2013-03-10 106 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());