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

What is the Recommended Event for Updating WebView Navigation 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()和enabling/disabling这些按钮。应该在:

canGoBack() 的文档当前 state 如果

returns 为真

this WebView has a back history item

canGoForward() 有类似的 Javadoc。

问题是当后台历史被更改时没有明确记录。这将完全取决于 WebView(Client) 的实现,并且这在未来总是会发生变化。它甚至可能在各种 Android devices/versions/forks.
上有所不同

doUpdateVisitedHistory()也没有明确记载:

Notify the host application to update its visited links database.

问题是它没有说明何时调用它,只说明您需要更新您访问过的链接。根据 WebView(Client) 实现,它可以比您希望的更早或更晚被调用。

我认为选择权在您,您可以确定您希望使代码避免可能出现的故障的安全性。

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

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

我就是这样用的,效果很好