更新WebView导航UI的推荐事件是什么?



WebView提供goBack()goForward()来实现典型的后退按钮行为,这可以绑定到按钮,操作栏项,或任何东西:

  @Override
  public boolean onOptionsItemSelected(MenuItem item) {
    switch(item.getItemId()) {
      case R.id.back:
        if (webView.canGoBack()) {
          webView.goBack();
        }
        break;
      case R.id.fwd:
        if (webView.canGoForward()) {
          webView.goForward();
        }
        break;
      case R.id.reload:
        webView.reload();
        break;
      default:
        return(super.onOptionsItemSelected(item));
    }
    return(true);
  }

WebView也有canGoBack()canGoForward(),告诉你如果这些是可行的选项给定当前的导航历史在WebView,上面显示的守卫围绕goBack()goForward()调用。

理论上,canGoBack()canGoForward()可用于启用或禁用按钮、操作栏项或其他任何内容。这将为您提供典型的浏览器UI,其中后退和前进按钮只有在它们具有实际效果时才可供用户使用。

不明显的是我们应该调用canGoBack()canGoForward()并启用/禁用这些按钮。应该在:

  • onPageStarted()在自定义WebViewClient ?
  • doUpdateVisitedHistory()在自定义WebViewClient ?
  • 在其他回调中?
  • 这些的组合?
  • 每秒钟或纯粹在计时器上,因为我们没有可靠的回调来确定何时应该更新这些?

canGoBack()的文档当前声明如果

它返回true

这个WebView有一个历史记录项

canGoForward()有一个类似的Javadoc。

问题是,当后台历史被更改时,没有清楚地记录下来。这将完全取决于WebView(客户端)的实现,这在未来可能会改变。它甚至可能在不同的Android设备/版本/分支上有所不同。

doUpdateVisitedHistory()也没有明确的文档:

通知宿主应用程序更新其访问的links数据库。

问题是它没有说明何时被调用,只是你需要更新你访问过的链接。它可以比你想要的更早或更晚调用,这取决于WebView(Client)的实现。


我认为这是你自己的选择,你可以决定你的代码对可能的故障有多安全

就我个人而言,我会在onPageStarted(), onPageFinished()doUpdateVisitedHistory()进行更新,因为它可以在所有合理预期的条件下工作,并且没有使用计时器轮询的性能开销。
然后我会在几个品牌和Android版本的设备上测试它,看看它是否像我预期的那样运行。
如果仍然不起作用,可以考虑实现计时器/轮询机制。

您可以使用onPageFinished回调中的canGoBack()和canGoForward()方法进行检查。这样,你就知道一个新页面刚刚加载完毕,这样你就可以验证webview是否可以前进或后退,然后启用/禁用你的按钮。

我这样使用它,效果很好

最新更新