【问题标题】:How to clear webview history?如何清除网页浏览历史记录?
【发布时间】:2019-10-24 22:26:43
【问题描述】:

webview 的历史没有清除...下面的代码有什么问题?

网页视图创建

mWebViewReport=(WebView)findViewById(R.id.report_page);
mWebViewReport.setWebViewClient(new HelloWebViewClient());
mWebViewReport.getSettings().setBuiltInZoomControls(true);

点击帮助按钮时加载帮助文件

mWebViewReport.loadUrl("file:///android_asset/help.html");
mWebViewReport.clearHistory();
mWebViewReport.clearCache(true);

点击摘要按钮时加载摘要文件

  mWebViewReport.loadUrl("file:///android_asset/summary.html");

    //On back button click
     if (mWebViewReport.canGoBack()) {
            mWebViewReport.goBack();
            return ;
      }

这里我也可以看到帮助页面...

【问题讨论】:

  • 试试这个mWebViewReport.clearView();

标签: android webview android-webview


【解决方案1】:

当 webview 正在加载页面(url)时,您无法清除历史记录,以便清除 onPageFinished 侦听器的历史记录设置,如下所示

在 onCreate 之前声明一个公共变量

boolean clearHistory = false;

现在,当您声明您的 mWebViewReport 时进行设置

mWebViewReport.setWebViewClient(new WebViewClient(){

    @Override
    public void onPageFinished(WebView view, String url) 
    {
        if (clearHistory)
        {
            clearHistory = false;        
            mWebViewReport.clearHistory();
        }
            super.onPageFinished(view, url);
    }
});

现在当你调用你的帮助 url 来清除历史记录时,只需将 clearHistory 设置为 true

mWebViewReport.loadUrl("file:///android_asset/help.html");
mWebViewReport.clearHistory();  // REMOVE THIS LINE
mWebViewReport.clearCache(true); // REMOVE THIS LINE
clearHistory = true; // ADD THIS LINE

【讨论】:

  • 我没有意识到需要在 onPageFinished() 中调用 clearHistory()。我打电话给它,什么也没发生——我猜是因为我的 webview 仍在异步加载内容。无论如何,谢谢你的回答。
  • 这是一个很好的解决方案,但确实存在一些问题。如果用户在新页面完成加载之前按下后退键(这可能是一个冗长的加载),则不会再调用 clearHistory。我真的找不到解决这个问题的好方法,除了搞乱后键处理,这将是非常复杂的彻底完成。 (对于特定情况可能有变通方法,我确实找到了一种可以接受的解决方法,但不是一般情况。)此外,我遇到了一些我强烈怀疑与调用 clearHistory 相关的崩溃。所以要小心。
  • @VSim 你好,你能告诉我如何用返回键清除历史记录
  • @zys 对不起,不是真的。如果您阅读了我的评论,我的经验是做好事很复杂,您可能不应该这样做。所以我的建议是仔细考虑一下,也许你会找到另一种方法来做你真正想要完成的事情。至少我是这样做的。
【解决方案2】:

我认为,clearHistory() 清除了back and forward list。所以当前加载的 url 仍然会保留在 back list 中。

【讨论】:

  • 并非不可能,如果您不关心 back or forward 列表中的内容,您只需在 mWebViewReport.loadUrl("file:///android_asset/summary.html"); 之前使用它,或者使用标志知道何时使用 clearhistory。根据您的要求和场景,可以有多种方法。目前,它可能无法正常工作,因为在您使用 clearhistory 时会加载帮助页面。希望这会有所帮助。
  • 我不确定您希望导航如何工作。但是你能利用这个吗? goBackOrForward(-2)
  • 在调用 clearHistroy 之前使用 webView.goBackOrForward(Integer.MIN_VALUE);似乎可以解决问题。
【解决方案3】:

Osama_Almaani 的解决方案效果很好!您可以通过将标志移动到 WebViewClient 实现中来优化您的代码。

在您的活动中定义一个字段并使用它来代替匿名声明:

private MyWebViewClient myWebViewClient = new MyWebViewClient();
...
myWebView.setWebViewClient(myWebViewClient);

使用新方法 clearHistory() 增强您的 WebViewClient 类:

private class MyWebViewClient extends WebViewClient {
  private boolean clearHistory = false;

  /**Use this instead of WebView.clearHistory(). */
  public void clearHistory(){
    clearHistory = true;
    }

  @Override
  public void onPageFinished(WebView view, String url) {
    if(clearHistory){
      Log.d(TAG, "clearHistory now");
      clearHistory = false;
      myWebView.clearHistory();
    }
    super.onPageFinished(view, url);
    }
}

现在你可以使用这个新方法了:

myWebViewClient.clearHistory();
mWebViewReport.loadUrl("file:///android_asset/help.html");

【讨论】:

  • 我使用了您的解决方案,一切正常。干得好!
  • 由于某种原因我不知道它在模拟器上工作但在真实设备上不工作,有什么想法吗?
  • 我想我们永远不会知道
猜你喜欢
  • 1970-01-01
  • 2016-09-02
  • 2011-11-14
  • 1970-01-01
  • 2013-12-01
  • 1970-01-01
  • 2012-08-25
  • 2013-12-27
  • 1970-01-01
相关资源
最近更新 更多