【问题标题】:How to detect when Android WebView has loaded page?如何检测 Android WebView 何时加载页面?
【发布时间】:2016-01-06 04:10:55
【问题描述】:

我有一个显示启动页面的应用程序,并在 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 Console中会报错:

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

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

谢谢!

编辑:有很多答案建议 onPageFinished,甚至有人将其标记为重复项,并带有指向使用 onPageFinished 的解决方案的链接。伙计们,我们已经在使用 onPageFinished。由于不可靠,我们正在寻找 onPageFinished 的替代方法。

【问题讨论】:

  • 这不是重复的。您链接的内容使用 onPageFinished 显示解决方案。如果您仔细阅读我们的帖子,您会发现我们已经在使用 onPageFinished 并且它可以工作......除了它有问题,所以我们正在寻找与 onPageFinished 不同的东西。

标签: android webview


【解决方案1】:

如果您需要,可以通过加载页面progress来实现这一点,您也可以使用这个。

 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...                  
                   } 
                }
            });

【讨论】:

    【解决方案2】:

    您应该使用WebChromeClient.onProgressChanged() 来获取当前加载页面的进度。

    【讨论】:

    • 我读到了这个。即使页面没有完全加载,我有时也会阅读 onProgressChanged == 100 。有什么想法吗?
    • 这可能是真的——我曾经观察到(在日志中)在三个连续的迭代中进度从“100”跳到“10”再到“100”。我总是做的是显示一个带有“正在加载网站...”文本的 TextView(嵌套在 WebView 内)。然后,当页面完全加载并准备好查看时,我会隐藏此 TextView(即 'tv.setVisibility(View.GONE)')。这种方法对我有用 - 因为它通知用户后台确实发生了某些事情(即正在请求网页);所以用户知道这一点,只需稍等片刻即可看到网页。
    【解决方案3】:

    如果您使用的启动画面是一个简单的静态图像,那么也许您可以尝试以下方法:

    1. 在 XML 中将启动画面 (ImageView) 嵌套在 WebView 内:

      <WebView android:id="@+id/wv_your_web_view_id"
          android:layout_width="match_parent"
          android:layout_height="match_parent">
      
          <ImageView android:id="@+id/iv_your_splash_screen_id"
              android:layout_width="match_parent"
              android:layout_height="match_parent"
              android:src="@mipmap/img_the_coolest_image_ever"
              android:contentDescription="@string/splash_screen_desc"/>
      </WebView>
      
    2. 现在是运行时代码:

      WebView wvUltimo = findViewById(R.id.wv_your_web_view_id);
      wvUltimo.loadUrl(REQUESTED_WEB_PAGE_URL);   // e.g. "https://www.google.com"
      wvUltimo.getSettings().setJavaScriptEnabled(true);   // Only enable this if you need Javascript to work within the WebView!!
      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 中直接访问初始屏幕,因此可以在您请求的网页可供查看时立即停用或隐藏它。

    【讨论】:

      【解决方案4】:

      这可以通过对 webview 使用 WebViewClient() 来完成。

      参考:How can I know that my WebView is loaded 100%?

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-05-10
        • 1970-01-01
        • 2015-02-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多