【问题标题】:Android WebView progress barAndroid WebView 进度条
【发布时间】:2011-02-02 00:10:23
【问题描述】:

我看过一个类似于 here 的问题,但由于我是新手,有人可以解释一下如何让它在 WebView 中工作,或者至少如何设置 10 秒的时间延迟,以便人们知道它正在加载?

【问题讨论】:

  • 这是stackoverflow.com/questions/2496119/… 的几乎完全相同的副本。去那边看看有没有帮助。如果没有,请编辑您的问题,详细说明您无法开始工作的具体内容。
  • 您已获得完整代码,可在指向 Android 开发者网站的链接中使用进度加载栏。你甚至尝试过使用他们的例子吗?一旦你有了,你应该能够适应你的需要。
  • 如何在片段中做同样的事情?我正在执行相同的步骤,但进度条不可见。

标签: android progress-bar webview


【解决方案1】:

对于水平进度条,您首先需要定义进度条并将其与您的 XML 文件链接,如下所示,在 onCreate:

final TextView txtview = (TextView)findViewById(R.id.tV1);
final ProgressBar pbar = (ProgressBar) findViewById(R.id.pB1);

然后,您可以在 WebChromeClient 中使用 onProgressChanged 方法:

MyView.setWebChromeClient(new WebChromeClient() {
            public void onProgressChanged(WebView view, int progress) {
               if(progress < 100 && pbar.getVisibility() == ProgressBar.GONE){
                   pbar.setVisibility(ProgressBar.VISIBLE);
                   txtview.setVisibility(View.VISIBLE);
               }

               pbar.setProgress(progress);
               if(progress == 100) {
                   pbar.setVisibility(ProgressBar.GONE);
                   txtview.setVisibility(View.GONE);
               }
            }
        });

在那之后,在你的布局中你有这样的东西

<TextView android:text="Loading, . . ." 
    android:textAppearance="?android:attr/textAppearanceSmall"
    android:id="@+id/tV1" android:layout_height="wrap_content"
    android:layout_width="wrap_content"
    android:textColor="#000000"></TextView>

<ProgressBar android:id="@+id/pB1"
    style="?android:attr/progressBarStyleHorizontal" android:layout_width="fill_parent"
    android:layout_height="wrap_content" android:layout_centerVertical="true"
    android:padding="2dip">
</ProgressBar>

这就是我在我的应用中的做法。

【讨论】:

【解决方案2】:

我刚刚在这里找到了一个非常好的示例: http://developer.android.com/reference/android/webkit/WebView.html 。 您只需将 setprogress 更改为:

activity.setProgress(progress * 1000);

到

activity.setProgress(progress * 100);

【讨论】:

  • 出现片段怎么办?
【解决方案3】:

这是在 android Web 视图中添加进度条的最简单方法。

在你的活动/片段中添加一个布尔字段

private boolean isRedirected;

这个布尔值将防止网页重定向导致死链接。现在你可以将你的 WebView 对象和 web Url 传递给这个方法。

private void startWebView(WebView webView,String url) {

    webView.setWebViewClient(new WebViewClient() {
        ProgressDialog progressDialog;

        public boolean shouldOverrideUrlLoading(WebView view, String url) {
            view.loadUrl(url);
            isRedirected = true;
            return false;
        }

        @Override
        public void onPageStarted(WebView view, String url, Bitmap favicon) {
            super.onPageStarted(view, url, favicon);
            isRedirected = false;
        }

        public void onLoadResource (WebView view, String url) {
            if (!isRedirected) {
                if (progressDialog == null) {
                    progressDialog = new ProgressDialog(SponceredDetailsActivity.this);
                    progressDialog.setMessage("Loading...");
                    progressDialog.show();
                }
            }

        }
        public void onPageFinished(WebView view, String url) {
            try{
                isRedirected=true;

                if (progressDialog.isShowing()) {
                    progressDialog.dismiss();
                    progressDialog = null;
                }



            }catch(Exception exception){
                exception.printStackTrace();
            }
        }

    });

    webView.getSettings().setJavaScriptEnabled(true);
    webView.loadUrl(url);
}

这里开始加载时会调用onPageStarted。这里我设置布尔字段为假。但是当页面加载完成时,它将来到onPageFinished 方法,这里的布尔字段设置为true。有时,如果 url 死了,它会被重定向,它会在 onPageFinished 方法之前到达 onLoadResource()。因此,它不会隐藏进度条。为了防止这种情况,我在onLoadResource() 中检查if (!isRedirected)

在 onPageFinished() 方法中,在关闭进度对话框之前,您可以编写 10 秒延时代码

就是这样。快乐编码:)

【讨论】:

  • 谢谢。我删除了shouldOverrideUrlLoading 和onLoadResource,将进度开始移至onPageStarted。还添加了onReceivedError 并在那里写了一个进度结束和祝酒消息。
【解决方案4】:

根据 Md. Sajedul Karim 回答我写了一个类似的。

webView = (WebView) view.findViewById(R.id.web);
progressBar = (ProgressBar) view.findViewById(R.id.progress);
webView.setWebChromeClient(new WebChromeClient());

setProgressBarVisibility(View.VISIBLE);
webView.setWebViewClient(new WebViewClient() {
    @Override
    public void onPageStarted(WebView view, String url, Bitmap favicon) {
        super.onPageStarted(view, url, favicon);
        setProgressBarVisibility(View.VISIBLE);
    }

    @Override
    public void onPageFinished(WebView view, String url) {
        super.onPageFinished(view, url);
        setProgressBarVisibility(View.GONE);
    }

    @Override
    public void onReceivedError(WebView view, WebResourceRequest request, WebResourceError error) {
        super.onReceivedError(view, request, error);
        Toast.makeText(getActivity(), "Cannot load page", Toast.LENGTH_SHORT).show();
        setProgressBarVisibility(View.GONE);
    }
});

webView.loadUrl(url);

private void setProgressBarVisibility(int visibility) {
    // If a user returns back, a NPE may occur if WebView is still loading a page and then tries to hide a ProgressBar.
    if (progressBar != null) {
        progressBar.setVisibility(visibility);
    }
}

【讨论】:

    【解决方案5】:

    确实,还有更完整的选项,比如为你想要的句子更改应用程序的名称。检查本教程它可以提供帮助:

    http://www.firstdroid.com/2010/08/04/adding-progress-bar-on-webview-android-tutorials/

    在该教程中,您有一个完整的示例如何在 webview 应用程序中使用进度条。

    阿德里安。

    【讨论】:

      【解决方案6】:

      这就是我使用 Kotlin 的方式,以百分比显示进度。

      我的片段布局。

      <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
               xmlns:tools="http://schemas.android.com/tools"
               android:layout_width="match_parent"
               android:layout_height="match_parent">
      
      <WebView
          android:id="@+id/webView"
          android:layout_width="match_parent"
          android:layout_height="match_parent"/>
      
      <ProgressBar
          android:layout_marginLeft="32dp"
          android:layout_marginRight="32dp"
          style="?android:attr/progressBarStyleHorizontal"
          android:layout_width="match_parent"
          android:layout_height="wrap_content"
          android:layout_gravity="center"
          android:id="@+id/progressBar"/>
      </FrameLayout>
      

      我在 onViewCreated 中的 kotlin 片段

          progressBar.max = 100;
          webView.webChromeClient = object : WebChromeClient() {
              override fun onProgressChanged(view: WebView?, newProgress: Int) {
                  super.onProgressChanged(view, newProgress)
                  progressBar.progress = newProgress;
              }
          }
      
          webView!!.webViewClient = object : WebViewClient() {
      
              override fun onPageStarted(view: WebView?, url: String?, favicon: Bitmap?) {
                  progressBar.visibility = View.VISIBLE
                  progressBar.progress = 0;
                  super.onPageStarted(view, url, favicon)
              }
      
              override fun shouldOverrideUrlLoading(view: WebView?, url: String?): Boolean {
                  view?.loadUrl(url)
                  return true
              }
      
              override fun shouldOverrideUrlLoading(
                  view: WebView?,
                  request: WebResourceRequest?): Boolean {
                  if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
                      view?.loadUrl(request?.url.toString())
                  }
                  return true
              }
      
              override fun onPageFinished(view: WebView?, url: String?) {
                  super.onPageFinished(view, url)
                  progressBar.visibility = View.GONE
              }
          }
      
          webView.loadUrl(url)
      

      【讨论】:

        【解决方案7】:

        您可能正在寻找大多数浏览器使用的进度条...

        我的 XML:

        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:orientation="vertical"
            app:layout_behavior="@string/appbar_scrolling_view_behavior">
            <LinearLayout
                android:id="@+id/progressLayout"
                android:layout_width="match_parent"
                android:layout_height="5dp"
                android:background="#3F51B5"
                android:orientation="horizontal">
                <ProgressBar
                    android:id="@+id/progressbar"
                    android:layout_width="match_parent"
                    android:layout_height="5dp"
                    android:background="#3F51B5"
                    android:indeterminate="false"
                    style="?android:progressBarStyleHorizontal" />
            </LinearLayout>
            <WebView
                android:id="@+id/webview"
                android:layout_width="match_parent"
                android:layout_height="match_parent" />
        </LinearLayout>
        

        onCreate 内部:

        webview.loadUrl("https://www.google.com");
        

        核心:

            webview.setWebViewClient(new WebViewClient() {
                @Override
                public void onPageStarted(WebView _param1, String _param2, Bitmap _param3) {
                    everyTime = new TimerTask() {
                        @Override
                        public void run() {
                            runOnUiThread(new Runnable() {
                                @Override
                                public void run() {
                                    progressbar.setProgress(webview.getProgress());
                                }
                            });
                        }
                    };
                    _timer.scheduleAtFixedRate(everyTime, (int)(1), (int)(1));
                    //This code below is optional
                    progressbar.setVisibility(View.VISIBLE);
                    //
                    super.onPageStarted(_param1, _param2, _param3);
                }
                
                @Override
                public void onPageFinished(WebView _param1, String _param2) {
                    progressLayout.setVisibility(View.INVISIBLE);
                    everyTime.cancel();
                    super.onPageFinished(_param1, _param2);
                }
            });
        

        如果你用 ChromeClient 替换 WebViewClient 没问题 ;)

        输出:

        【讨论】:

          【解决方案8】:

          等到进程结束...

          while(webview.getProgress()< 100){}
          progressBar.setVisibility(View.GONE);
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2019-03-26
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2012-06-29
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多