Como programar una rueda de espera ProgressDialog

23 septiembre, 2011 por Gonzalo de Córdoba Dejar una respuesta »

Objetivo:

Vamos a aprender a crear un ProgressDialog; es decir, un mensaje de espera (junto con una rueda giratoria en este caso) mientras se realizan acciones en segundo plano.

Esto es ideal cuando deseamos que el usuario espere para mostrar estos datos, y al tardar algo de tiempo, deseamos advertirles que esperen.

La aplicación programada en este caso son dos Actividades. La primera llamará a la segunda, la cual debe procesar unos datos antes de mostarlos, y por tanto implementará el ProgressDialog.

Vemos primero una captura de pantalla de la aplicación que vamos a programar:

Programacion Android -ProgressDialog 1Programacion Android -ProgressDialog 2Programacion Android -ProgressDialog 3
     

Código fuente java (/src/Principal.java):

package com.progressdialog;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;

public class Principal extends Activity {

    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.principal);
    }

    public void onClick_ExampleApp(View v){
    	startActivity(new Intent(this, Ejemplo_con_rueda.class));
    }
}

Código fuente java (/src/Ejemplo_con_rueda.java):

package com.progressdialog;

import android.app.Activity;
import android.app.ProgressDialog;
import android.os.AsyncTask;
import android.os.Bundle;
import android.util.Log;
import android.widget.TextView;

public class Ejemplo_con_rueda extends Activity {

	//variables necesarias
    private ProgressDialog pd = null;
    private Object data = null;

    private TextView texto;

    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.ejemplo_con_rueda);

        //asignamos el TextView para mostrar luego los datos procesados
        this.texto = (TextView) findViewById(R.id.texto);

        // Mostrar el ProgressDialog en este Thread
        this.pd = ProgressDialog.show(this, "Procesando", "Espere unos segundos...", true, false);

        // Se comienza la nueva Thread que descargará los datos necesarios
        new DownloadTask().execute("Parametros que necesite el DownloadTask");
    }

    /**
     * Muestra el texto resultado
     * @param String textoAMostrar
     */
	public void mostrarResultado(String textoAMostrar){
    	this.texto.setText(textoAMostrar);
    }

    /**
     * Subclase privada que crea un hilo aparte para realizar
     * las acciones que deseemos.
     */
    private class DownloadTask extends AsyncTask {
         protected String doInBackground(String... args) {
             Log.i("Mi app", "Empezando hilo en segundo plano");

             // Aqui se realizan las operaciones necesarias
             // Como ejemplo, simulamos que se trabaja durante unos segundos con un for
             for (int i=1;i             }

             return "Datos ya procesados (resultado)";
         }

         protected void onPostExecute(Object result) {
             // Pasamos el resultado de los datos a la Acitvity principal
        	 Ejemplo_con_rueda.this.mostrarResultado((String)result);
             if (Ejemplo_con_rueda.this.pd != null) {
                 Ejemplo_con_rueda.this.pd.dismiss();
             }
         }
    }
}

Código fuente XML (/res/layout/principal.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">
	<TextView android:layout_width="fill_parent"
		android:layout_height="wrap_content" android:text="@string/hello" />

	<Button android:id="@+id/button_ExampleApp" android:onClick="onClick_ExampleApp"
		android:layout_gravity="center" android:layout_width="200dip"
		android:layout_height="wrap_content" android:text="actividad 2" />
</LinearLayout>
 

Código fuente XML (/res/layout/ejemplo_con_rueda.xml):

<?xml version="1.0" encoding="utf-8"?>
<?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">

	<TextView android:layout_width="fill_parent"
		android:layout_height="wrap_content"
		android:text="Datos no procesados aun"
		android:id="@+id/texto" />

</LinearLayout>

Descárgate el código aquí

4 comentarios

  1. Jordi dice:

    Gracias por los tutoriales.
    Se agradece mucho que a parte de código, esté bin explicado :D

    (No era el que buscaba, pero me ha ayudado a entender algunas cosillas :))

  2. Diego dice:

    Hola amigos bueno quisiera agradecerles sobre los tutos que hacen que son de mucha ayuda para los que empezamos a programar en android.
    Tengo una consulta estaba observando sobre el Articulo de la Clase AsyncTask y tengo una duda sobre ese tema. Mi duda es la siguiente ahi tu le das un valor maximo de 1400000 al progressDialog y que valla aumentando de uno en uno el progressDialog hasta que llegue a 100 pero mi duda es la siguiente yo tengo un login en Android con Conexion a Pagina web y cuando lleno mi formulario del login y doy click en aceptar, empieza a ejecutar el codigo pero al dar click en el boton se pone como la pantalla como un poco lento osea creo que tiene un tiempo que se demora en comunicarse con la pagina web y hacer la consulta con la BD de la pagina web y verificar si existe el usuario o no. Mi duda es la siguiente como yo calculo el tiempo que se demora en hacer la consulta a la pagina web con Conexion a Base de Datos, para asi yo poner un progressDialog y ya no darle 1400000 sino el tiempo que he calculado en consultar a la Pagina web con Base de Datos. Gracias de antemano espero su pronta respuesta. Saludos desde PERU.

    • Juan dice:

      Puedes usar un progressDialog indeterminado cuando el termine en el doInBackground el desaparecera el dialog.

    • Yamir dice:

      Debes declararlo en el doInBackGround() de tu AsynTask. Una vez que haya terminado, el dialogo desaparece y vuelves al main thread. Saludos

Deja tu comentario


× 8 = 24

Uso de cookies

Este sitio web utiliza cookies para que usted tenga la mejor experiencia de usuario. Si continúa navegando está dando su consentimiento para la aceptación de las mencionadas cookies y la aceptación de nuestra política de cookies, pinche el enlace para mayor información.