2010-06-22 8 views
34

Tengo una vista web para anular el navegador integrado y quiero mostrar un indicador de progreso en la barra de título.Android: la barra de progreso en el título de la ventana no muestra

Este es el código:

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    getWindow().requestFeature(Window.FEATURE_PROGRESS); 

    setContentView(R.layout.browser); 
    currentURL = BrowserActivity.this.getIntent().getExtras().getString("currentURL"); 

    try { 
     mWebView = (WebView) findViewById(R.id.webview); 
     mWebView.getSettings().setJavaScriptEnabled(true); 
     mWebView.setWebViewClient(new browserActivityClient()); 
     setProgressBarIndeterminateVisibility(true); 
     mWebView.loadUrl(currentURL); 
     setProgressBarIndeterminateVisibility(false); 
    } catch (Exception e) { 
     Log.e(getClass().getSimpleName(), "Browser: " + e.getMessage()); 
     Toast.makeText(this, e.getMessage(), Toast.LENGTH_LONG).show(); 
    } 
} 

que debería funcionar, creo que, de acuerdo con documentos de Android y otras muestras que he visto en la red. Pero no es así, ¿podría decirme por favor dónde me equivoco?

Y otra pregunta: si a veces más tarde elegiré declarar android:theme="@android:style/Theme.NoTitleBar" en el manifiesto de la aplicación, ¿la barra de progreso se mostrará más o no?

Gracias.

Respuesta

46

De hecho, el código correcto (Probado y de trabajo):

public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    requestWindowFeature(Window.FEATURE_INDETERMINATE_PROGRESS); 
    requestWindowFeature(Window.FEATURE_PROGRESS); 
    currentURL = BrowserActivity.this.getIntent().getExtras().getString("currentURL"); 

    setContentView(R.layout.browser); 

    setProgressBarIndeterminateVisibility(true); 
    setProgressBarVisibility(true); 

    try { 
     mWebView = (WebView) findViewById(R.id.webview); 
     mWebView.getSettings().setJavaScriptEnabled(true); 
     mWebView.setWebViewClient(new browserActivityClient()); 

     mWebView.setWebChromeClient(new WebChromeClient() { 
      public void onProgressChanged(WebView view, int progress) { 
       setProgress(progress * 100); 
       if(progress == 100) { 
       setProgressBarIndeterminateVisibility(false); 
       setProgressBarVisibility(false); 
       } 
      } 
     }); 
     mWebView.loadUrl(currentURL); 
    } catch (Exception e) { 
     Log.e(getClass().getSimpleName(), "Browser: " + e.getMessage()); 
     Toast.makeText(this, e.getMessage(), Toast.LENGTH_LONG).show(); 
    } 
} 
+1

Gracias, eso es exactamente lo que estaba buscando. –

+0

Funciona perfectamente, gracias! Tenga en cuenta que requestWindowFeature (Window.FEATURE_INDETERMINATE_PROGRESS); y setProgressBarIndeterminateVisibility (true); establece el progreso del rotor en la barra de acción. –

+0

podría señalar cuál es la principal diferencia? – ironic

3

WebView.loadUrl se ejecuta en un hilo nativo, por lo que setProgressBarIndeterminateVisibility (false) se llama inmediatamente. Además, si usa Theme.NoTitleBar, la barra de título no se mostrará y, dado que la barra de progreso está en la barra de título, tampoco se mostrará.

Algo como esto debería funcionar.

public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    getWindow().requestFeature(Window.FEATURE_PROGRESS); 

    setContentView(R.layout.browser); 
    currentURL = BrowserActivity.this.getIntent().getExtras().getString("currentURL"); 

    try { 
     mWebView = (WebView) findViewById(R.id.webview); 
     mWebView.getSettings().setJavaScriptEnabled(true); 
     mWebView.setWebViewClient(new browserActivityClient()); 
     setProgressBarIndeterminateVisibility(true); 
     mWebview.setWebChromeClient(new WebChromeClient() { 
      public void onProgressChanged(WebView view, int progress) { 
       if(progress == 100) { 
       setProgressBarIndeterminateVisibility(false); 
       } 
      } 
     }); 
     mWebView.loadUrl(currentURL); 
    } catch (Exception e) { 
     Log.e(getClass().getSimpleName(), "Browser: " + e.getMessage()); 
     Toast.makeText(this, e.getMessage(), Toast.LENGTH_LONG).show(); 
    } 
} 
+0

¡Muchas gracias! – Manu

+0

Soy extremadamente nuevo en el desarrollo de Android, por lo que esta puede ser una pregunta tonta. ¿Qué debo importar para usar 'BrowserActivity'? – Nick

+0

@Nick, BrowserActivity es la actividad actual en la que está implementando su código. Es el nombre de tu actividad. – Brigadier

16

que tiene el mismo problema también.

Porque me puse la android: theme = "@ android: estilo/Theme.NoTitleBar"

lo resuelvo por añadir un ProgressBar en el archivo de diseño xml, tales como:

<?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" 
> 

<ProgressBar android:id="@+id/progressbar" 
    style="?android:attr/progressBarStyleHorizontal" 
    android:layout_width="fill_parent" 
    android:layout_height="3px" 
    android:max="100" 
    android:visibility="gone" 
/> 

<WebView 
    android:id="@+id/webview" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
/> 

</LinearLayout> 
En

código:

// url cuando la carga

progressBar.setProgress(0); 
progressBar.setVisible(View.VISIBLE); 

...

// cargando ... cambió el progreso

progressBar.setProgress(progress); 

...

// cuando la página termine

progressBar.setVisible(View.GONE); 

C'est fin!

10

He resuelto el problema.

Su llamada a setProgressBarVisibility() debe estar en onStart() o onResume() porque, antes de ese punto, parece que no está garantizado para tener cualquier vista en la que se puede cambiar una visibilidad.


Para esta increíble solución de Dralangus, aquí hay algunos códigos de producción totalmente probados. ¡Muchas gracias, Dralangus! Finalmente, una ruleta que no desaparece al girar el dispositivo.

public class MainActivity extends Activity 
{ 
private static boolean showSpinner; // needs static 

public void spinnerOn() 
    { 
    showSpinner = true; 
    setProgressBarIndeterminateVisibility(true); 
    } 

public void spinnerOff() 
    { 
    showSpinner = false; 
    setProgressBarIndeterminateVisibility(false); 
    } 

protected void onResume() 
    { 
    // solved by Dralangus http://stackoverflow.com/a/7414659/294884 
    super.onResume(); 
    if (showSpinner) 
     { 
     spinnerOn(); 
     } 
    else 
     { 
     spinnerOff(); 
     } 
    } 

protected void onStart() 
    { 
    super.onStart(); 
    // note, onResume is called EVEN LATER than onStart, 
    // so your most reliable choice is onResume. 
    // eternal thanks to Dralangus for this solution 
    } 

@Override 
protected void onCreate(Bundle savedInstanceState) 
    { 
    super.onCreate(savedInstanceState); 
    requestWindowFeature(Window.FEATURE_INDETERMINATE_PROGRESS); 

    setContentView(R.layout.activity_main); 

    ... // Your code 
    } 
+1

Para 'ListActivity' esta es la solución Muchas gracias – Chaitanya

+0

Una de las respuestas más sorprendentes en el sitio. Muchas gracias, Dralangus. Bounty en el camino! – Fattie

8

Al ver cómo se mezclan algunas respuestas a las dos barras de progreso, decidió añadir otra respuesta

Estos son para la barra de progreso horizontal en la parte superior

requestWindowFeature(Window.FEATURE_PROGRESS); 
setProgressBarIndeterminate(true); 
setProgress(intVal); 
setProgressBarVisibility(true); 

estos son para el spinner- Barra de progreso de estilo en la barra de acciones

requestWindowFeature(Window.FEATURE_INDETERMINATE_PROGRESS); 
setProgressBarIndeterminateVisibility(true); 

No es necesario que solicite b otras características de la ventana, solo la correspondiente al tipo de progreso que necesita.

El error en el código de OP se titulándose setProgressBarIndeterminateVisibility(true) no haber solicitado Window.FEATURE_INDETERMINATE_PROGRESS (o viceversa: llamar setProgressBarIndeterminateVisibility() en lugar de setProgressBarVisibility())

7

Parece que con Android 5.0 (API 21) y por encima de Windows.FEATURE_PROGRESS ya no funciona. Tomando algunas sugerencias de la respuesta de univasity, pude construir una barra de progreso similar a las de otros navegadores.

activity_main.xml"

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" 
xmlns:tools="http://schemas.android.com/tools" 
android:layout_width="match_parent" 
android:layout_height="match_parent" 
tools:context=".MainActivity" 
android:id="@+id/relativeLayout"> 

<WebView 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    android:id="@+id/webView" /> 

<ProgressBar 
    android:id="@+id/progressBar" 
    style="?android:attr/progressBarStyleHorizontal" 
    android:layout_width="fill_parent" 
    android:layout_height="8dp" 
    android:max="100" 
    android:progressTint="#FF29A8FF" 
    android:progressBackgroundTint="#FFFFFFFF" 
    android:visibility="gone" /> 
</FrameLayout> 

El FrameLayout permite que la barra de progreso para flotar por encima de la vista web. Configuración android:max a 100 hace que se alinean con el rango por defecto en la actividad, por lo que los valores no tienen que . ser convertido a la forma predeterminada de 0-10000 utilizado de otra manera por la barra de progreso android:visibility="gone" hace que la barra de progreso invisible por defecto

MainActivty.java:.

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

    // Get the WebView and the ProgressBar from activity_main.xml. 
    final WebView mainWebView = (WebView) findViewById(R.id.webView); 
    final ProgressBar progressBar = (ProgressBar) findViewById(R.id.progressBar); 

    // Enables JavaScript. 
    mainWebView.getSettings().setJavaScriptEnabled(true); 

    // Updates the progress bar whenever there are changes and hides it again when it completes. 
    mainWebView.setWebChromeClient(new WebChromeClient() { 
     public void onProgressChanged(WebView view, int progress) { 
      if (progress < 100) { 
        progressBar.setVisibility(View.VISIBLE); 
       } else { 
        progressBar.setVisibility(View.GONE); 
       } 
      progressBar.setProgress(progress); 
     } 
    }); 

    // Makes the mainWebView handle all URLs internally instead of calling the default browser. 
    mainWebView.setWebViewClient(new WebViewClient()); 

    // Load a sample URL. 
    mainWebView.loadUrl("http://developer.android.com/"); 
} 
+1

Para decirlo sin rodeos, acabo de pasar alrededor de 6 horas tratando de hacer que esta barra de progreso funcione y he hojeado más de 20 preguntas y respuestas aquí y en todas partes, y esto es, ** el único **, que parece funcionar en pleno pantalla webview. Te amo por eso Gracias. –

Cuestiones relacionadas