35

Estoy intentando agregar una barra de progreso/carga a mi aplicación que usa WebView. Estoy confundido sobre cómo implementar una barra de progreso que aparece cada vez que se hace clic en un enlace.Agregar una barra de progreso en WebView

código actual:

public class CULearnBrowser extends Activity { 

    WebView webview; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 
     webview = (WebView) findViewById(R.id.webview); 
     webview.setWebViewClient(new HelloWebViewClient()); 
     webview.getSettings().setJavaScriptEnabled(true); 
     webview.loadUrl("https://culearn.colorado.edu/webct/entryPageIns.dowebct"); 
    } 

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

    public boolean onKeyDown(int keyCode, KeyEvent event) { 
     if ((keyCode == KeyEvent.KEYCODE_BACK) && webview.canGoBack()) { 
      webview.goBack(); 
      return true; 
     } 
     return super.onKeyDown(keyCode, event); 
    } 
} 

diseño Actividad:

<?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 xmlns:android="http://schemas.android.com/apk/res/android" 
     android:id="@+id/webview" 
     android:layout_width="fill_parent" 
     android:layout_height="fill_parent" /> 

    <TextView 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" 
     android:text="@string/hello" /> 
</LinearLayout> 
+1

posible duplicado de [Android barra de progreso WebView] (http://stackoverflow.com/questions/2537454/android-webview -progress-bar) –

+0

Cómo descargar un pdf o un documento en Button click from WebView –

+0

La respuesta que está buscando está muy detallada aquí: http://www.giantflyingsaucer.com/blog/?p=1331 – andufo

Respuesta

59

Este link puede ayudarle.

He agregado algunas líneas en su código y ahora funciona bien con la barra de progreso.

 getWindow().requestFeature(Window.FEATURE_PROGRESS); 
     setContentView(R.layout.main); 
     // Makes Progress bar Visible 
     getWindow().setFeatureInt(Window.FEATURE_PROGRESS, Window.PROGRESS_VISIBILITY_ON); 

     webview = (WebView) findViewById(R.id.webview); 
     webview.setWebChromeClient(new WebChromeClient() { 
      public void onProgressChanged(WebView view, int progress) 
      { 
       //Make the bar disappear after URL is loaded, and changes string to Loading... 
       setTitle("Loading..."); 
       setProgress(progress * 100); //Make the bar disappear after URL is loaded 

       // Return the app name after finish loading 
       if(progress == 100) 
        setTitle(R.string.app_name); 
       } 
      }); 
     webview.setWebViewClient(new HelloWebViewClient()); 
     webview.getSettings().setJavaScriptEnabled(true); 
     webview.loadUrl("http://www.google.com"); 
+0

ive visto cosas así, pero no sé cómo hacerlo con mi código – Sean

+1

Sin ver todo el código, no es posible ble para entender – Sandy

+0

ive adjunté el xml este es el único otro archivo – Sean

6

Ponga una barra de progreso y la vista web dentro de un RelativeLayout y establecer las propiedades de la barra de progreso de la siguiente manera,

  1. Hacer su visibilidad como desaparecido.
  2. CENTRE en la Relativelayout.

y luego en onPageStarted() del cliente web hacen visible la barra de progreso para que muestre la barra de progreso cuando ha hecho clic en un enlace. En onPageFinished() hace que la visibilidad de la barra de progreso sea GONE para que desaparezca cuando la página haya terminado de cargarse ... Esto funcionará bien para su escenario. Espero que esto ayude ...

13

en oncreate método donde ha configurado su Webview.

@Override 
protected void onCreate(Bundle savedInstanceState) { 
// TODO Auto-generated method stub 
super.onCreate(savedInstanceState); 

this.requestWindowFeature(Window.FEATURE_NO_TITLE); 
setContentView(R.layout.web_view); 

web_view = (WebView) findViewById(R.id.web_view); 
pd = new ProgressDialog(SiteOpenInWebView.this); 
    pd.setMessage("Please wait Loading..."); 
    pd.show(); 
    web_view.setWebViewClient(new MyWebViewClient()); 
    web_view.loadUrl("ur site name"); 
} 

WebViewClient

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

    if (!pd.isShowing()) { 
     pd.show(); 
    } 

    return true; 
} 

@Override 
public void onPageFinished(WebView view, String url) { 
    System.out.println("on finish"); 
    if (pd.isShowing()) { 
     pd.dismiss(); 
    } 

    } 
} 
+1

He intentado tantos códigos pero no código trabajando en la vista web de la barra de progreso. Pero este código está funcionando bien gracias a Nitesh Khosla –

+0

igual que es su código sin cambio barra de progreso en lugar de progressdialog –

+0

Esto funcionó para mí. gracias – AD14

7

Aquí está el código que estoy usando:

Dentro WebViewClient:

   @Override 
      public void onPageStarted(WebView view, String url, Bitmap favicon) { 

       super.onPageStarted(view, url, favicon); 
       findViewById(R.id.progress1).setVisibility(View.VISIBLE); 
      } 

      @Override 
      public void onPageFinished(WebView view, String url) { 
       findViewById(R.id.progress1).setVisibility(View.GONE); 
      } 

Aquí es el XML:

<ProgressBar 
    android:id="@+id/progress1" 
    android:layout_centerHorizontal="true" 
    android:layout_centerVertical="true" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" /> 

Espero que esto ayude ..

10

pasar su URL en este método

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

Puede probar este código en su actividad

private void startWebView(WebView webView,String url) { 
webView.setWebViewClient(new WebViewClient() { 
      ProgressDialog progressDialog; 

      public boolean shouldOverrideUrlLoading(WebView view, String url) { 
       view.loadUrl(url); 
       return false; 
      } 

      @Override 
      public void onPageStarted(WebView view, String url, Bitmap favicon) { 
       super.onPageStarted(view, url, favicon); 
      } 

      public void onLoadResource (WebView view, String url) { 

        if (progressDialog == null) { 
         progressDialog = new ProgressDialog(SponceredDetailsActivity.this); 
         progressDialog.setMessage("Loading..."); 
         progressDialog.show(); 
        } 

      } 
      public void onPageFinished(WebView view, String url) { 
       try{ 
        if (progressDialog.isShowing()) { 
         progressDialog.dismiss(); 
         progressDialog = null; 
        } 

       }catch(Exception exception){ 
        exception.printStackTrace(); 
       } 
      } 

     }); 

     webView.getSettings().setJavaScriptEnabled(true); 
     webView.loadUrl(url); 
    } 

llamar a este método utilizando de esta manera:

startWebView(web_view,"Your Url"); 

A veces, si la URL está muerta, se redireccionará y llegará a onLoadResource() antes del método onPageFinished. Por esta razón, la barra de progreso no se cerrará. Para resolver este problema, vea my this Answer.

Gracias :)

3

La mejor approch que funcionó para mí es

webView.setWebViewClient(new WebViewClient() { 

    @Override public void onPageStarted(WebView view, String url, Bitmap favicon) { 
      super.onPageStarted(view, url, favicon); 
      mProgressBar.setVisibility(ProgressBar.VISIBLE); 
      webView.setVisibility(View.INVISIBLE); 
     } 

    @Override public void onPageCommitVisible(WebView view, String url) { 
     super.onPageCommitVisible(view, url); 
     mProgressBar.setVisibility(ProgressBar.GONE); 
     webView.setVisibility(View.VISIBLE); 
     isWebViewLoadingFirstPage=false; 
    } 
} 
+1

¿Cuál es el propósito de este booleano isWebViewLoadingFirstPage, dónde inicializar esto? – Chandrahasan