Como programar una rueda de espera ProgressDialog

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):

[sourcecode language=”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));
}
}
[/sourcecode]

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

[sourcecode language=”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();
}
}
}
}
[/sourcecode]

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

[sourcecode language=”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>
[/sourcecode]

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

[sourcecode language=”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>
[/sourcecode]

Descárgate el código aquí