Android WebView 进度条

Posted

技术标签:

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

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

【问题讨论】:

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

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

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

【讨论】:

这应该被标记为最佳答案,因为它在 WebView 文档 (developer.android.com/reference/android/webkit/WebView.html) 的代码 sn-ps 中已弃用的代码方面是最新的【参考方案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 秒延时代码

就是这样。快乐编码:)

【讨论】:

谢谢。我删除了shouldOverrideUrlLoadingonLoadResource,将进度开始移至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_
         android:layout_>

<WebView
    android:id="@+id/webView"
    android:layout_
    android:layout_/>

<ProgressBar
    android:layout_marginLeft="32dp"
    android:layout_marginRight="32dp"
    style="?android:attr/progressBarStyleHorizontal"
    android:layout_
    android:layout_
    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_
    android:layout_
    android:orientation="vertical"
    app:layout_behavior="@string/appbar_scrolling_view_behavior">
    <LinearLayout
        android:id="@+id/progressLayout"
        android:layout_
        android:layout_
        android:background="#3F51B5"
        android:orientation="horizontal">
        <ProgressBar
            android:id="@+id/progressbar"
            android:layout_
            android:layout_
            android:background="#3F51B5"
            android:indeterminate="false"
            style="?android:progressBarStyleHorizontal" />
    </LinearLayout>
    <WebView
        android:id="@+id/webview"
        android:layout_
        android:layout_ />
</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);

【讨论】:

以上是关于Android WebView 进度条的主要内容,如果未能解决你的问题,请参考以下文章

Android:如何在将数据加载到 WebView 时显示进度条?

如何停止 Android webView swipeToRefresh 加载进度条?

Android WebView 进度条

带进度条的WebView

带进度条的WebView

android中webview 怎么实现网页加载时显示加载进度