Android WebView何时加载完页面时如何检测?

4
我有一个应用程序,它显示一个启动页,并在WebView中加载URL时删除该启动页。以下是我们使用的相关代码以删除启动页:
browser.setWebViewClient(new BrowserClient() {
 @Override
 public void onPageFinished(WebView view, String url) {
  super.onPageFinished(view, url);
  // Work around for WebView onPageFinished called twice                
  if (flag == true) {
   browser.setVisibility(View.VISIBLE);
   splashImage.setVisibility(View.INVISIBLE);
   pageLoader.setVisibility(View.INVISIBLE);
  } else {
   flag = true;
  }
 }
});

这段代码可以工作,但是速度很慢。启动页需要很长时间才能移除,而网页已经加载完成。

有没有什么技巧可以可靠地检测到WebView何时加载完页面?我已经研究了几天,但似乎找不到可靠的方法。

我看到最有希望的方法是下面这个,但放置此代码会在Android控制台中引发错误:

@Override
public void invalidate() {
 super.invalidate();

 if (getContentHeight() > 0) {
  // WebView has displayed some content and is scrollable.
 }
}

谢谢!

编辑:有很多答案提出了onPageFinished,甚至有人将其标记为使用onPageFinished的解决方案的重复链接。朋友们,我们已经在使用onPageFinished了。由于其不可靠性,我们正在寻找替代方法。


可能是重复的问题:如何在Android中监听Webview完成加载URL? - Adhikari Bishwash
这不是重复内容。你提供的链接展示了使用onPageFinished的解决方案。如果你仔细阅读我们的帖子,你会发现我们已经在使用onPageFinished并且它有效...只是它存在问题,所以我们正在寻找与onPageFinished不同的解决方案。 - user4951834
5个回答

6
如果需要的话,您可以通过在使用此网络客户端时加载页面进度来实现这一点,您也可以使用这个方法。
 webView.setWebChromeClient(new WebChromeClient() {
                public void onProgressChanged(WebView view, int progress) {
                   Log.e("progress", ""+progress);
                   if (progress == 100) { //...page is fully loaded.
                     // TODO - Add whatever code you need here based on web page load completion...                  
                   } 
                }
            });

0

我看到过这个问题。有时候在页面没有完全加载完成的情况下,onProgressChanged会显示100。你有什么想法吗? - user4951834
这可能是真的 - 我曾经观察到(在日志中)进度从“100”跳到“10”再跳回“100”,连续三次迭代。我通常做的是显示一个TextView(嵌套在WebView内部),上面写着“正在加载网站...”。当页面完全加载并准备好查看时,我会隐藏此TextView(即'tv.setVisibility(View.GONE)')。这种方法对我很有效 - 因为它通知用户背景中确实发生了某些事情(即正在请求网页),因此用户知道这一点,只需等待短时间即可查看网页。 - SilSur

0
如果您使用的启动画面是一个简单的静态图像,那么也许您可以尝试以下方法:
在XML中,将闪屏(ImageView)嵌套到WebView中:
``` ```
现在是运行时代码:
``` WebView wvUltimo = findViewById(R.id.wv_your_web_view_id); wvUltimo.loadUrl(REQUESTED_WEB_PAGE_URL); //例如 "https://www.google.com" wvUltimo.getSettings().setJavaScriptEnabled(true); //仅在需要WebView中使用Javascript时启用! wvUltimo.setWebChromeClient(new WebChromeClient() { public void onProgressChanged(WebView view, int progress) { // Log.d(TAG + " 185", "Load Status: " + progress); if (progress == 100) { ImageView ivCoolSplash = view.findViewById(R.id.iv_your_splash_screen_id); ivCoolSplash.setVisibility(View.GONE); } } }); ```

这样可以确保您可以直接从 WebView 中访问您的闪屏,因此当您请求的网页准备好进行查看时,您可以立即停用或隐藏它。


0

Xamarin/MAUI方案(参见OnPageFinished):

webView.SetWebViewClient(new CustomWebViewClient());

...

public class CustomWebViewClient : WebViewClient
{
    public CustomWebViewClient()
    {
    }

    public override void OnPageFinished(Android.Webkit.WebView view, string url)
    {
        base.OnPageFinished(view, url);

        // Your Logic comes here
    }
}

-1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接