-
慕村9548890
延展WebViewClient打电话onPageFinish()如下:mWebView.setWebViewClient(new WebViewClient() {
public void onPageFinished(WebView view, String url) {
// do your stuff here
}});
-
郎朗坤
这并不是百分之百准确。如果一个页面中有几个iframes,那么就会有多个onPageFinish(和onPageStarted)。如果您有几个重定向,它也可能失败。这种方法解决了(几乎)所有的问题:boolean loadingFinished = true;boolean redirect = false;mWebView.setWebViewClient(new WebViewClient() {
@Override
public boolean shouldOverrideUrlLoading(WebView view, String urlNewString) {
if (!loadingFinished) {
redirect = true;
}
loadingFinished = false;
webView.loadUrl(urlNewString);
return true;
}
@Override
public void onPageStarted(WebView view, String url) {
loadingFinished = false;
//SHOW LOADING IF IT ISNT ALREADY VISIBLE
}
@Override
public void onPageFinished(WebView view, String url) {
if (!redirect) {
loadingFinished = true;
//HIDE LOADING IT HAS FINISHED
} else {
redirect = false;
}
}});最新情况:根据文档:当嵌入式框架的内容发生变化时,即单击目标为iframe的链接时,将不会调用onPageStarted。我在Twitter上发现了一个特殊的例子,在Twitter上,只有一个页面被调用,逻辑有点混乱。为了解决这个问题,我在X秒之后添加了一个预定任务来删除加载。这并不是所有其他情况下都需要的。更新2:现在,使用当前的AndroidWebView实现:boolean loadingFinished = true;boolean redirect = false;
mWebView.setWebViewClient(new WebViewClient() {
@Override
public boolean shouldOverrideUrlLoading(
WebView view, WebResourceRequest request) {
if (!loadingFinished) {
redirect = true;
}
loadingFinished = false;
webView.loadUrl(request.getUrl().toString());
return true;
}
@Override
public void onPageStarted(
WebView view, String url, Bitmap favicon) {
super.onPageStarted(view, url, favicon);
loadingFinished = false;
//SHOW LOADING IF IT ISNT ALREADY VISIBLE
}
@Override
public void onPageFinished(WebView view, String url) {
if (!redirect) {
loadingFinished = true;
//HIDE LOADING IT HAS FINISHED
} else {
redirect = false;
}
}
});
-
梦里花落0921
我非常喜欢@NeTeInSteiN(和@Polen)解决方案,但我会用一个计数器来实现它,而不是多个布尔人或州观察者(只是另一种口味,但我认为这可能有共同之处)。它确实有一个JS的细微差别,但我觉得逻辑更容易理解。private void setupWebViewClient() {
webView.setWebViewClient(new WebViewClient() {
private int running = 0; // Could be public if you want a timer to check.
@Override
public boolean shouldOverrideUrlLoading(WebView webView, String urlNewString) {
running++;
webView.loadUrl(urlNewString);
return true;
}
@Override
public void onPageStarted(WebView view, String url, Bitmap favicon) {
running = Math.max(running, 1); // First request move it to 1.
}
@Override
public void onPageFinished(WebView view, String url) {
if(--running == 0) { // just "running--;" if you add a timer.
// TODO: finished... if you want to fire a method.
}
}
});}