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

4
如何在加载数据到Webview时显示进度条? 我的代码如下:
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    this.requestWindowFeature(Window.FEATURE_PROGRESS);
    getWindow().setFeatureInt( Window.FEATURE_PROGRESS, Window.PROGRESS_VISIBILITY_ON); 
    this.setProgressBarVisibility(true);
    setContentView(R.layout.layout_article);
    WebView webview = (WebView) findViewById(R.id.webView);
    final Activity activity = this;
    webview.setWebChromeClient(new WebChromeClient() {
        public void onProgressChanged(WebView view, int progress) {
            activity.setProgress(progress * 100);
        }
    });

    webView.loadUrl("http://google.com");
}

您需要将上传操作移至独立的线程中,以释放主 UI 线程的句柄。您还需要决定是显示旋转器还是进度条。 - Philip Sheard
1
最好的方法是Paresh建议的,但你必须使用WebViewClient,使用这种技术,你不必关心从服务器抓取了多少数据。 - Yuvi
我希望以下链接能够帮助你:https://dev59.com/u2DVa4cB1Zd3GeqPaSEH#9171581 - mayur rahatekar
可能是Android WebView进度条的重复问题。 - e-sushi
4个回答

5
在调用loadData()函数之前,先尝试展示ProgressDialog或将ProgressBar放置在布局内。在WebViewClient内部,只需dismiss() progressDialog或使ProgressBar不可见。例如:
// when finish loading page
public void onPageFinished(WebView view, String url) {
       if(mProgress.isShowing()) {
             mProgress.dismiss();
       }
}

请注意,在完成Web客户端设置后才调用loadData()或loadURL()。可以参考这个例子: 使用ProgressDialog加载WebView

WebChromeClient类没有onPageFinished()方法,它在WebViewClient中。 - Yuvi
你仍然写成了 WebClient,正确应该是 WebViewClient。参见:http://developer.android.com/reference/android/webkit/WebViewClient.html#onPageFinished(android.webkit.WebView, java.lang.String) - Yuvi

3
请尝试以下代码:
ProgressDialog progDailog = ProgressDialog.show( context,"Process ", "Loading Data...",true,true);

new Thread ( new Runnable()
{
     public void run()
     {
      // your data loading code goes here
     }
}).start();

 Handler progressHandler = new Handler() 
 {

     public void handleMessage(Message msg1) 
     {

         progDailog.dismiss();
         }
 }

3
public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        final ProgressBar progress = (ProgressBar) findViewById(R.id.progress);

        WebView webView = (WebView) findViewById(R.id.webview);
        webView.getSettings().setJavaScriptEnabled(true);
        webView.setWebViewClient(new WebViewClient() {
            @Override
            public boolean shouldOverrideUrlLoading(final WebView view, final String url) {
                return false;
            }

            @Override
            public void onPageStarted(final WebView view, final String url, final Bitmap favicon) {
                progress.setVisibility(View.VISIBLE);
                super.onPageStarted(view, url, favicon);
            }

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

        webView.loadUrl("http://google.com");
    }
}

还有R.layout.activity_main

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
     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:id="@+id/progress"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:visibility="gone"
        android:layout_centerInParent="true"/>
</RelativeLayout>

0

首先创建自定义的WebView类,并在xml中使用它,如下所示:

 <com.app.ui.views.CustomWebView
        android:id="@+id/webView"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        >

    </com.app.ui.views.CustomWebView>

请确保高度不应为固定值,而应该是“wrap_content”

现在可以制作自定义的 Webview 类如下:

 public class CustomWebView extends WebView {

    private ProgressBar progressBar;
    private Context context;
    private LinearLayout loaderLayout;

    public CustomWebView(Context context) {
    super(context);

    this.context = context;
    initProgressBar();

    loadUrlWithData();

}

public CustomWebView(Context context, AttributeSet attrs) {
    super(context, attrs);

    this.context = context;
    initProgressBar();

}

public CustomWebView(Context context, AttributeSet attrs, int defStyle) {
    super(context, attrs, defStyle);

    this.context = context;

    initProgressBar();

}

private void initProgressBar() {
    progressBar = new ProgressBar(context);
    progressBar.setIndeterminate(false);

}

private void setLoading(boolean isLoading) {

  if (isLoading) {

   progressBar.setVisibility(View.VISIBLE);

   loaderLayout = new LinearLayout(context);
   loaderLayout.setGravity(Gravity.CENTER);
   loaderLayout.setOrientation(LinearLayout.HORIZONTAL);

    LinearLayout.LayoutParams parentLayoutParams = new LinearLayout.LayoutParams(
                LinearLayout.LayoutParams.MATCH_PARENT,
                LinearLayout.LayoutParams.WRAP_CONTENT);
        loaderLayout.setLayoutParams(parentLayoutParams);

        LinearLayout.LayoutParams progressBarLayoutParams = new 
        LinearLayout.LayoutParams(75, 75);
        progressBar.setLayoutParams(progressBarLayoutParams);

        if (progressBar.getParent() != null) {
            ((ViewGroup) progressBar.getParent()).removeView(progressBar);
        }
        loaderLayout.addView(progressBar);

        // add this loaderLayout to your parent view in which your webview is added

        else {

           progressBar.setVisibility(View.GONE);
        }

  }

  private void loadUrlWithData(){
     setLoading(true);
     //Load your HTML data with url here

  }

 //When the content will be loaded, the webview will change it's height
 @Override
protected void onSizeChanged(int w, int h, int ow, int oh) {
    super.onSizeChanged(w, h, ow, oh);

    if (h > 400) {
        setLoading(false);
    }
}

}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接