22

在我的应用程序中,我有一个WebView,它加载了来自Internet的任何URL。现在,有时由于网络速度慢,该页面需要很长时间才能加载,用户只能看到空白屏幕。Android ProgessBar加载WebView时

我想显示一个ProgressBarWebView被加载,并且当WebView被完全加载时隐藏ProgessBar

我知道如何使用ProgressBarAsyncTask s,但这里是我的问题。

这是我用来加载我的WebView的代码。

mWebView = (WebView) findViewById(R.id.webview); 
    mWebView.getSettings().setJavaScriptEnabled(true); 
    mWebView.setWebViewClient(new HelloWebViewClient()); 
    mWebView.loadUrl(web_URL); 

这我的自定义WebViewClient

private class HelloWebViewClient extends WebViewClient { 
    @Override 
    public boolean shouldOverrideUrlLoading(WebView view, String url) { 
     view.loadUrl(url); 
     return true; 
    } 
} 

现在,如果我尝试显示ProgressBar使用AsyncTask小号话,我想我将不得不给的代码加载URL中doInBackGround()函数我的AsyncTask并显示通过onProgressUpdate()函数的进度。

但是,我怎么加载URL的doInBackground()为doInBackground()非UI线程上运行里面,我将无法使用mWebView.loadUrl(web_URL)里面。

有什么建议吗?我错过了明显的东西吗?请指导我。

+0

http://stackoverflow.com/questions/4331094/how-to-add-a-progress-bar-in-webview可能重复 – Shrikant

+1

在此堆叠问题HTTP完美地解释道://计算器。 com/questions/5207540/android-webview – Goofyahead

+0

[Android WebView进度条]可能重复(http://stackoverflow.com/questions/2537454/android-webview-progress-bar) –

回答

37

检查源代码。帮助你解决你的问题...

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

我认为它对你有帮助。

谢谢。

+0

非常感谢很多:-) – Gattsu

+2

为什么需要调用'shouldOverrideUrlLoading'方法吗? – winklerrr

+0

shouldOverrideUrlLoading现已弃用:N Developer Preview具有此方法签名: public boolean shouldOverrideUrlLoading(WebView视图,WebResourceRequest请求) – Trinity

20

我想在webView加载时显示progressBar,当webView完全加载时隐藏 progessBar。

以下代码段将帮助您。

main.xml中

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

主。

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, "Showing ProgressDialog", "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(Main.this, "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"); 
    } 
} 
+0

为未来的读者解释您的代码以便轻松理解。 – Gattsu

+1

ProgressDialog在API 26中已弃用,文档建议使用ProgressBar。 https://developer.android.com/reference/android/app/ProgressDialog.html – saswanb

12

通过您的网址,在这个方法中

private void startWebView(String url) { 

      WebSettings settings = webView.getSettings(); 

      settings.setJavaScriptEnabled(true); 
      webView.setScrollBarStyle(View.SCROLLBARS_OUTSIDE_OVERLAY); 

      webView.getSettings().setBuiltInZoomControls(true); 
      webView.getSettings().setUseWideViewPort(true); 
      webView.getSettings().setLoadWithOverviewMode(true); 

      progressDialog = new ProgressDialog(ContestActivity.this); 
      progressDialog.setMessage("Loading..."); 
      progressDialog.show(); 

      webView.setWebViewClient(new WebViewClient() { 
       @Override 
       public boolean shouldOverrideUrlLoading(WebView view, String url) { 
        view.loadUrl(url); 
        return true; 
       } 

       @Override 
       public void onPageFinished(WebView view, String url) { 
        if (progressDialog.isShowing()) { 
         progressDialog.dismiss(); 
        } 
       } 

       @Override 
       public void onReceivedError(WebView view, int errorCode, String description, String failingUrl) { 
        Toast.makeText(ContestActivity.this, "Error:" + description, Toast.LENGTH_SHORT).show(); 

       } 
      }); 
      webView.loadUrl(url); 
     } 
+2

工作正常。谢谢! – Ferrrmolina

0
myThanh.setScrollBarStyle(WebView.SCROLLBARS_OUTSIDE_OVERLAY); 

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

    progressBar = ProgressDialog.show(MainActivity.this,"Đang tải dữ liệu", "Vui lòng chờ..."); 

    myThanh.setWebViewClient(new WebViewClient() { 


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

这种简单的解决方案科特林工作对我来说:

private fun setupWebView() { 

    val webViewClient: WebViewClient = object: WebViewClient() { 

     override fun shouldOverrideUrlLoading(view: WebView?, request: WebResourceRequest?): Boolean { 
      view?.loadUrl(request?.url.toString()) 
      return super.shouldOverrideUrlLoading(view, request) 
     } 

     override fun onPageStarted(view: WebView?, url: String?, favicon: Bitmap?) { 
      showProgressDialog() 
      super.onPageStarted(view, url, favicon) 
     } 

     override fun onPageFinished(view: WebView?, url: String?) { 
      hideProgressDialog() 
      super.onPageFinished(view, url) 
     } 
    } 
    webView.webViewClient = webViewClient 

    webView.settings.javaScriptEnabled = true 
    webView.settings.defaultTextEncodingName = "utf-8" 
} 
+0

有时候,onPageFinished看起来并不是每个onPageStarted调用都调用的,所以当一个hide调用发生时,showLoading指标计数器增加,这会减少屏幕上的加载指示符。发生在Galaxy S4(Android 5.0.1 - WebView客户端版本51.0.2704.81)上,并在一个Nougat供电设备上。 – DoruAdryan

0
String url = "https://stackoverflow.com/questions/11241513/android-progessbar-while-loading-webview"; 
progressBar.setVisibility(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); 
     setProgressBarVisibility(View.GONE); 
    } 
}); 

webView.loadUrl(url); 

也加入M ethod:

private void setProgressBarVisibility(int visibility) { 
    progressBar.setVisibility(visibility); 
}