22

W mojej aplikacji mam WebView, który ładuje dowolny adres URL z Internetu. Teraz, czasami z powodu wolnych sieci, ładowanie strony zajmuje dużo czasu, a użytkownik widzi tylko pusty ekran.Android ProgessBar podczas ładowania WebView

Chcę pokazać , gdy WebView zostanie załadowany i ukryć ProgessBar po całkowitym załadowaniu WebView.

Wiem, jak korzystać z ProgressBar i AsyncTask s, ale tutaj jest mój problem.

To jest kod, którego używam do ładowania mojego WebView.

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

A to mój zwyczaj WebViewClient klasa

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

Teraz, gdy próbuję pokazać ProgressBar użyciu AsyncTask s następnie Chyba będę musiał podać kod, aby załadować URL w doInBackGround() Funkcja mojego AsyncTask i pokazuje postęp poprzez funkcję onProgressUpdate().

Ale jak mogę załadować URL wewnątrz doInBackground() jako doInBackground() działa na gwincie dla UI i wont być w stanie wykorzystać mWebView.loadUrl(web_URL) wewnątrz niego.

Wszelkie sugestie? Czy brakuje mi czegoś oczywistego? Proszę, prowadź mnie.

+0

http://stackoverflow.com/questions/4331094/how-to-add-a-progress-bar-in-webview możliwe duplikat – Shrikant

+1

doskonale wyjaśnione w tej kwestii stosu http: // stackoverflow. com/questions/5207540/android-webview – Goofyahead

+0

możliwy duplikat paska postępu w Android WebView (http://stackoverflow.com/questions/2537454/android-webview-progress-bar) –

Odpowiedz

37

Sprawdź kod źródłowy. Pomóż i rozwiąż swój problem ...

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

Myślę, że to ci pomoże.

Dzięki.

+0

Niesamowite dzięki: --) – Gattsu

+2

Dlaczego należy wywołać metodę 'shouldOverrideUrlLoading'? – winklerrr

+0

shouldOverrideUrlLoading jest obecnie przestarzały: Podgląd dewelopera N ma podpis tej metody: public boolean shouldOverrideUrlLoading (widok WebView, żądanie WebResourceRequest) – Trinity

20

Chcę pokazać Progressbar natomiast Webview zostanie załadowany i ukryć się progessBar gdy Webview zostanie załadowany całkowicie.

Poniższy fragment pomoże.

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> 

Główny.Klasa

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

Wyjaśnij swój kod dla przyszłych czytelników, aby łatwo zrozumieć. – Gattsu

+1

Program ProgressDialog jest nieaktualny w interfejsie API 26, a dokumentacja zaleca korzystanie z paska postępu. https://developer.android.com/reference/android/app/ProgressDialog.html – saswanb

12

zdać URL w tej metodzie

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

Dobrze działa. Dzięki! – 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

To proste rozwiązanie pracował dla mnie w 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

Czasami wygląda na to, że funkcja onPageFinished nie jest wywoływana dla każdego wywołania onPageStarted, więc zwiększenie licznika wskaźnika showLoading, które zmniejsza się, gdy nastąpi wywołanie ukrywania, pozostawia wskaźnik ładowania na ekranie. Zdarzyło mi się na Galaxy S4 (Android 5.0.1 - klient WebView w wersji 51.0.2704.81) oraz na urządzeniu zasilanym przez 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); 

także dodać m ethod:

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