如何在android中将url加载到webview时显示进度?

Posted

技术标签:

【中文标题】如何在android中将url加载到webview时显示进度?【英文标题】:how to display progress while loading a url to webview in android? 【发布时间】:2012-07-02 13:38:44 【问题描述】:

我正在将 url 加载到 webview 中:

WebView webview=(WebView)findViewById(R.id.webview); 
webview.loadUrl(url);

加载 url 需要一些时间,在此期间它会显示一个空白屏幕。我想在加载 url 时显示一个进度对话框:

ProgressDialog dialog = ProgressDialog.show(this, "HI","Loading......", true);

但是,上面的代码不起作用。如果有任何想法,请帮助。提前致谢。

【问题讨论】:

可能重复:***.com/questions/3149216/… 【参考方案1】:

为您的 WebView 设置一个 WebViewClient,在您的 onCreate() 方法上启动您的进度对话框,并在页面在 onPageFinished(WebView view, String url) 中完成加载时将其关闭

import android.app.Activity;
import android.app.AlertDialog;
import android.app.ProgressDialog;
import android.content.DialogInterface;
import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.util.Log;
import android.view.Window;
import android.webkit.WebSettings;
import android.webkit.WebView;
import android.webkit.WebViewClient;
import android.widget.Toast;

public class Main extends Activity 
    private WebView webview;
    private static final String TAG = "Main";
    private ProgressDialog progressBar;  

    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) 
        super.onCreate(savedInstanceState);

        requestWindowFeature(Window.FEATURE_NO_TITLE);

        setContentView(R.layout.main);

        this.webview = (WebView)findViewById(R.id.webview);

        WebSettings settings = webview.getSettings();
        settings.setjavascriptEnabled(true);
        webview.setScrollBarStyle(WebView.SCROLLBARS_OUTSIDE_OVERLAY);

        final AlertDialog alertDialog = new AlertDialog.Builder(this).create();

        progressBar = ProgressDialog.show(Main.this, "WebView Example", "Loading...");

        webview.setWebViewClient(new WebViewClient() 
            public boolean shouldOverrideUrlLoading(WebView view, String url) 
                Log.i(TAG, "Processing webview url click...");
                view.loadUrl(url);
                return true;
            

            public void onPageFinished(WebView view, String url) 
                Log.i(TAG, "Finished loading URL: " +url);
                if (progressBar.isShowing()) 
                    progressBar.dismiss();
                
            

            public void onReceivedError(WebView view, int errorCode, String description, String failingUrl) 
                Log.e(TAG, "Error: " + description);
                Toast.makeText(activity, "Oh no! " + description, Toast.LENGTH_SHORT).show();
                alertDialog.setTitle("Error");
                alertDialog.setMessage(description);
                alertDialog.setButton("OK", new DialogInterface.OnClickListener() 
                    public void onClick(DialogInterface dialog, int which) 
                        return;
                    
                );
                alertDialog.show();
            
        );
        webview.loadUrl("http://www.google.com");
    

你的 main.xml 布局

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_
    android:layout_
    >
    <WebView android:id="@string/webview"
        android:layout_
        android:layout_
        android:layout_weight="1" />
</LinearLayout>

【讨论】:

感谢你的好例子,你拯救了我的一天!【参考方案2】:

您将不得不覆盖 onPageStarted 和 onPageFinished 回调

mWebView.setWebViewClient(new WebViewClient() 

        public void onPageStarted(WebView view, String url, Bitmap favicon) 
            if (progressBar!= null && progressBar.isShowing()) 
                progressBar.dismiss();
            
            progressBar = ProgressDialog.show(WebViewActivity.this, "Application Name", "Loading...");
        

        public boolean shouldOverrideUrlLoading(WebView view, String url) 
            view.loadUrl(url);

            return true;
        

        public void onPageFinished(WebView view, String url) 
            if (progressBar.isShowing()) 
                progressBar.dismiss();
            
        

        public void onReceivedError(WebView view, int errorCode, String description, String failingUrl) 
            alertDialog.setTitle("Error");
            alertDialog.setMessage(description);
            alertDialog.setButton("OK", new DialogInterface.OnClickListener() 
                public void onClick(DialogInterface dialog, int which) 
                    return;
                
            );
            alertDialog.show();
        
    );

【讨论】:

【参考方案3】:

查看示例代码。对你有帮助。

 private ProgressBar progressBar;
 progressBar=(ProgressBar)findViewById(R.id.webloadProgressBar);
 WebView urlWebView= new WebView(Context);
    urlWebView.setWebViewClient(new AppWebViewClients(progressBar));
                        urlWebView.getSettings().setJavaScriptEnabled(true);
                        urlWebView.loadUrl(detailView.getUrl());

public class AppWebViewClients extends WebViewClient 
     private ProgressBar progressBar;

    public AppWebViewClients(ProgressBar progressBar) 
        this.progressBar=progressBar;
        progressBar.setVisibility(View.VISIBLE);
    
    @Override
    public boolean shouldOverrideUrlLoading(WebView view, String url) 
        // TODO Auto-generated method stub
        view.loadUrl(url);
        return true;
    

    @Override
    public void onPageFinished(WebView view, String url) 
        // TODO Auto-generated method stub
        super.onPageFinished(view, url);
        progressBar.setVisibility(View.GONE);
    

谢谢。

【讨论】:

将 ProgressBar 的可见性设置为 GONE 是错误的 - 必须将视图从视图堆栈中删除。【参考方案4】:

您需要通过扩展 WebViewClient 类为您的 WebView 设置自己的 WebViewClient。

你需要实现onPageStarted(在此处显示)和onPageFinished(在此处关闭)这两个方法。

有关此主题的更多指导可以在 Google 的 WebView tutorial 中找到

【讨论】:

【参考方案5】:
  public void onReceivedError(WebView view, int errorCode, String description, String failingUrl) 
        alertDialog.setTitle("Error");
        alertDialog.setMessage(description);
        alertDialog.setButton("OK", new DialogInterface.OnClickListener() 
            public void onClick(DialogInterface dialog, int which) 
                return;
            
        );
        alertDialog.show();
    
);

【讨论】:

以上是关于如何在android中将url加载到webview时显示进度?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 iOS 中将本地(文档目录)html 加载到 webview 中?

如何加载图像 url 以适合我在 android 中的 webview?

如果我在 Android 上使用 webview,是不是必须应用 SSL 才能在 webview 上加载 URL?

Android Rotation 重定向到 webview 的根 URL

Android webview如何检测何时重新加载

如何从 URL 在 webView 中加载 PDF?