con - fundamentos de programacion android pdf



Android: la barra de progreso en el título de la ventana no se visualiza (4)

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 los documentos de Android y otras muestras que vi 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.


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 estilo hilandero en la barra de acciones

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

No necesita solicitar ambas funciones de ventana, solo la que necesita para el tipo de progreso que necesita.

El error en el código de OP es establecer setProgressBarIndeterminateVisibility(true) haber solicitado Window.FEATURE_INDETERMINATE_PROGRESS (o viceversa: llamar a setProgressBarIndeterminateVisibility() lugar de setProgressBarVisibility() )


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

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

Parece que con Android 5.0 (API 21) y 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>

FrameLayout permite que la barra de progreso flote sobre la vista web. Configuración de android:max to 100 hace que se alinee con el rango predeterminado en la actividad, por lo que los valores no tienen que convertirse a los valores predeterminados de 0-10000 que la barra de progreso usa. 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/");
}

También tengo el mismo problema.

Porque configuro el android: theme = "@ android: style / Theme.NoTitleBar"

Lo resuelvo agregando un ProgressBar en el archivo xml de diseño, 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 codigo:

// cuando carga url

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

...

// cargando ... el progreso ha cambiado

progressBar.setProgress(progress);

...

// cuando finaliza la página

progressBar.setVisible(View.GONE);

C'est acabado!





titlebar