Join FlipAndroid.COM Telegram Group: https://t.me/joinchat/F_aqThGkhwcLzmI49vKAiw


Android: la barra de progreso en el título de la ventana no se muestra

Tengo una vista web para anular el navegador incorporado y quiero mostrar un indicador de progreso en la barra de título.

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

Debería funcionar, creo, de acuerdo con documentos Android y otras muestras que vi en la red. Pero no lo hace, ¿podría por favor decirme dónde estoy equivocado?

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

Gracias.

  • Android: ¿Cómo establecer un contexto generadoMenú título?
  • Cómo quitar la barra de título de Actividad que extiende ActionBarActivity o AppcompatActivity con tema de diálogo
  • Centro Alinee el título en la barra de acción utilizando estilos en android.
  • Cómo deshabilitar la barra de estado o barra de notificación, pero no deshabilitar la barra de título en android?
  • Calcule el rumbo de la brújula / rumbo a la ubicación en Android
  • Android: cambia el título en ActionBar desde el Gaveta de navegación
  • Cómo mostrar el título de la barra de acciones de Android sin que se produzca el truncamiento
  • ¿Cómo puedo detectar un clic en el título de ActionBar?
  • 6 Solutions collect form web for “Android: la barra de progreso en el título de la ventana no se muestra”

    De hecho, el código correcto es (probado y funcionando):

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

    Tengo el mismo problema también.

    Porque yo establecí el androide: theme = "@ android: style / Theme.NoTitleBar"

    Lo soluciono mediante la adición de un ProgressBar en el archivo xml de diseño, como por ejemplo:

     <?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 codigo:

    // cuando url de carga

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

    // Cargando … progreso cambiado

     progressBar.setProgress(progress); 

    // cuando termine la página

     progressBar.setVisible(View.GONE); 

    C'est finish!

    He resuelto el problema.

    Su llamada a setProgressBarVisibility() debe estar en onStart() o onResume() porque, antes de ese punto, parece que no se garantiza tener ninguna vista en la que pueda cambiar una visibilidad.


    Para esta increíble solución de Dralangus, he aquí un código de producción completamente probado. ¡Muchas gracias, Dralangus! Por último, una ruleta que no desaparece con la rotación del 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 } 

    Al ver cómo algunas respuestas mezclan las dos barras de progreso, decidió agregar 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 la barra de progreso de estilo spinner en la barra de acciones

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

    No es necesario solicitar las dos características de la ventana, solo la del tipo de progreso que necesita.

    El error en el código de OP es caling setProgressBarIndeterminateVisibility(true) no habiendo solicitado Window.FEATURE_INDETERMINATE_PROGRESS (o viceversa: llamando a setProgressBarIndeterminateVisibility() lugar de setProgressBarVisibility() )

    Parece que con Android 5.0 (API 21) y encima de Windows.FEATURE_PROGRESS ya no funciona. Tomando algunas pistas de la respuesta de la unividad, pude construir una barra de progreso similar a la 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> 

    FrameLayout permite que la barra de progreso flote sobre la vista web. La configuración de android:max 100 la hace alinear con el rango predeterminado en la actividad, por lo que los valores no tienen que ser convertidos al valor predeterminado de 0-10000 que de otra manera sería usado por la barra de progreso. android:visibility="gone" hace que la barra de progreso sea 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/"); } 

    WebView.loadUrl se ejecuta en un subproceso nativo de modo que setProgressBarIndeterminateVisibility (false) se llama inmediatamente bastante. También si utiliza Theme.NoTitleBar la barra de título no se mostrará y como la barra de progreso está en la barra de título no se mostrará tampoco.

    Algo así 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(); } } 
    FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.