Android WebView进度栏


69

我曾在这里看到过类似的问题,但由于我是新手,所以有人可以解释如何使其在WebView中工作,或者至少如何设置10秒的延迟时间,以便人们知道它正在加载吗?


1
这几乎是stackoverflow.com/questions/2496119/…的副本。看看那边是否有帮助。如果不是,请编辑您的问题,以提供您实际上没有设法上班的详细信息。
史蒂夫·哈利

1
您已经获得了完整的代码,可以在Android开发者网站的链接中提供进度加载栏。您甚至尝试使用他们的榜样吗?拥有之后,您应该能够使其适应您的需求。
史蒂夫·海利

我如何在片段中做同样的事情?我正在按照相同的步骤进行操作,但是进度条不可见。
Prakhar Mohan Srivastava

Answers:


140

对于水平进度条,您首先需要定义进度条并将其与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>

这就是我在应用程序中所做的事情。


3
这应该被标记为最佳答案,因为就WebView文档的代码段(developer.android.com/reference/android/webkit/WebView.html)中不推荐使用的代码而言,它是最新的
DaveNOTDavid


10

这是在Android Web View中添加进度栏的最简单方法。

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

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。在这里我设置布尔字段为false。但是,当页面加载完成时,它将进入onPageFinished方法,并且此处布尔字段设置为true。有时,如果url无效,它将被重定向,并到达 methodonLoadResource()之前 onPageFinished。因此,它不会隐藏进度条。为了防止这种情况,我正在签if (!isRedirected)onLoadResource()

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

而已。快乐的编码:)


1
谢谢。我删除shouldOverrideUrlLoadingonLoadResource,移动的进度开始onPageStarted。还添加onReceivedError并写了进度结束和祝酒消息。
CoolMind '16

10

根据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);
    }
}


3

这就是我与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>

我的kotlin片段在onViewCreated中

    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)

-2

等到过程结束...

while(webview.getProgress()< 100){}
progressBar.setVisibility(View.GONE);
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.