更新 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这些按钮。应该在:
onPageStarted()
在自定义 WebViewClient
?
doUpdateVisitedHistory()
在自定义 WebViewClient
?
- 在其他回调中?
- 这些的一些组合?
- 纯粹在计时器上每秒左右,因为我们没有可靠的回调来确定何时应该更新这些?
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 您的按钮。
我就是这样用的,效果很好
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这些按钮。应该在:
onPageStarted()
在自定义WebViewClient
?doUpdateVisitedHistory()
在自定义WebViewClient
?- 在其他回调中?
- 这些的一些组合?
- 纯粹在计时器上每秒左右,因为我们没有可靠的回调来确定何时应该更新这些?
canGoBack()
的文档当前 state 如果
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 您的按钮。
我就是这样用的,效果很好