22

Nella mia applicazione, ho un WebView che carica qualsiasi URL da Internet. Ora, a volte a causa di reti lente, la pagina impiega molto tempo per essere caricata e l'utente vede solo uno schermo vuoto.ProgessBar Android durante il caricamento di WebView

Voglio mostrare un ProgressBar mentre il WebView viene caricato e nascondere ProgessBar quando il WebView viene caricato completamente.

So usare lo ProgressBar e AsyncTask s, ma ecco il mio problema.

Questo è il codice che utilizzo per caricare il mio WebView.

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

E questa mia abitudine WebViewClient classe

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

Ora, se provo a mostrare il ProgressBar utilizzando AsyncTask s allora credo che avrei dovuto dare il codice per caricare l'URL nella Funzione doInBackGround() del mio AsyncTask e mostra l'avanzamento attraverso la funzione onProgressUpdate().

Ma, come faccio a caricare l'URL all'interno del doInBackground() come doInBackground() corre sul filo non-UI e Non sarò in grado di utilizzare mWebView.loadUrl(web_URL) al suo interno.

Qualche suggerimento? Mi manca qualcosa di ovvio? Per favore guidami.

+0

http://stackoverflow.com/questions/4331094/how-to-add-a-progress-bar-in-webview possibile duplicato – Shrikant

+1

perfettamente spiegato a questo stack domanda http: // StackOverflow. it/questions/5207540/android-webview – Goofyahead

+0

possibile duplicato di [barra di avanzamento Android WebView] (http://stackoverflow.com/questions/2537454/android-webview-progress-bar) –

risposta

37

Controllare il codice sorgente. Aiutarti e risolvere il tuo problema ...

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

Penso che sia di aiuto.

Grazie.

+0

Incredibile grazie mille :-) – Gattsu

+2

Perché il metodo 'shouldOverrideUrlLoading' deve essere chiamato? – winklerrr

+0

shouldOverrideUrlLoading è deprecato ora: N Developer Preview ha questa firma del metodo: booleano pubblico shouldOverrideUrlLoading (visualizzazione WebView, richiesta WebResourceRequest) – Trinity

20

Voglio mostrare una barra di progresso mentre la webView viene caricata e nascondere la progessBar quando il webView viene caricato completamente.

Lo snippet seguente ti aiuterà.

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> 

principale.Classe

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

Spiegare facilmente il codice per i lettori del futuro. – Gattsu

+1

ProgressDialog è obsoleto nell'API 26 e i documenti raccomandano l'utilizzo di ProgressBar. https://developer.android.com/reference/android/app/ProgressDialog.html – saswanb

12

passare l'URL in questo metodo

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

Funziona bene. Grazie! – 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

Questa semplice soluzione ha funzionato per me in Kotlin:

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

A volte, sembra che onPageFinished non venga chiamato per ogni chiamata onPageStarted, quindi con un contatore di indicatori ShowLoading che diminuisce quando si verifica una chiamata hide lascia un indicatore di caricamento sullo schermo. Mi è successo su Galaxy S4 (Android 5.0.1 - Client WebView versione 51.0.2704.81) e su un dispositivo alimentato a 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); 

aggiungere anche m etodo:

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