更新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()调用的goForward()

理论上, canGoBack()canGoForward()可用于启用或禁用按钮,操作栏项等等。 这将为您提供典型的浏览器UI,其中后退和前进按钮仅在用户具有实际效果时可用。

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

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

canGoBack()的文档当前声明它返回true,如果

此WebView具有后退历史记录项

canGoForward()有一个类似的Javadoc。

问题是,当后面的历史记录发生变化时,没有明确记录。 它完全取决于WebView(客户端)的实现,并且将来可能总是会发生变化。 在各种Android设备/版本/分叉上甚至可能会有所不同。

doUpdateVisitedHistory()也没有明确记录:

通知主机应用程序更新其访问链接数据库。

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

我认为您可以选择确定您的代码对可能的失败的安全性。

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

您可以使用onPageFinished回调中的方法canGoBack()和canGoForward()进行检查 。 这样,您就知道新页面刚刚完成加载,因此您可以validationwebview是可以前进还是后退,然后启用/禁用按钮。

我用这种方式,效果很好