Diálogos modales en Android (AlertDialog)


Una de las desventajas de las interfaces táctiles es que en ocasiones pulsamos por error elementos que no deseamos. Por ello es conveniente realizar diálogos de confirmación en aquellas operaciones que tengan un carácter sensible, como por ejemplo la eliminación de un registro de la base de datos o la ejecución de una transacción financiera.

Para crear diálogos modales haremos uso de la clases android.app.AlertDialog y android.app.AlertDialog.Builder. El proceso a realizar será el siguiente:

  • Crear un método que genere el diálogo. En él construiremos paso a paso los elementos que queremos mostrar y utilizar, como mensajes, botones y acciones a realizar.
  • Llamar al método show() para mostrar el diálogo.

Imaginemos que en nuestra Activity deseamos realizar una conexión a un dispositivo Bluetooth, y el método destinado a ello recibe el nombre de conectarDispositivo(). Este método recibirá una cadena de texto que indicará la dirección del dispositivo, que se utilizará para obtener una referencia del dispositivo en sí. Olvidémonos del funcionamiento interno de la función y centrémonos en el hecho de que se trata de un método de nuestra Activity y que necesita parámetros para su ejecución:


    public void conectarDispositivo(String direccion)
    {
    	if(this.servicio != null)
    	{
    		BluetoothDevice dispositivoRemoto = this.bAdapter.getRemoteDevice(direccion);
    		servicio.solicitarConexion(dispositivoRemoto);
    		this.ultimoDispositivo = dispositivoRemoto;
    	}
    }

Existen varias formas de realizar este proceso, pero a continuación detallaremos el modo “inline”, en el que generaremos los handlers de los eventos en el propio método que construirá el diálogo. Nuestro método tendrá la siguiente firma:


	private AlertDialog crearDialogoConexion(String titulo, String mensaje, final String direccion)
	{
	}

El primer parámetro representará el título del diálogo, el segundo contendrá el texto y el último parámetro contendrá la información que queremos pasarle posteriormente al método que originalmente íbamos a ejecutar. Así, en lugar de ejecutar lo siguiente:


	conectarDispositivo(direccion);

Nuestro código permitirá la confirmación mediante el siguiente código:


	AlertDialog dialogo = crearDialogoConexion("Confirmación",
			"¿Conectar al dispositivo " + direccion + "?",
			direccion);
	dialogo.show();

Lo primero que deberemos realizar en nuestro método crearDialogoConexion() será instanciar un nuevo AlertDialog.Builder y asociarle un título y un mensaje.


	// Instanciamos un nuevo AlertDialog Builder y le asociamos titulo y mensaje
	AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(this);
	alertDialogBuilder.setTitle(titulo);
	alertDialogBuilder.setMessage(mensaje);

A continuación crearemos los listeners que se encargarán de ejecutar el código asociado a la pulsación de los botones del diálogo. En este caso, crearemos dos botones: aceptar y cancelar. El código asociado al botón Cancelar será el siguiente:


	// Creamos un nuevo OnClickListener para el boton Cancelar
	DialogInterface.OnClickListener listenerCancelar = new DialogInterface.OnClickListener() {

		@Override
		public void onClick(DialogInterface dialog, int which) {
			return;
		}
	};

Como podemos comprobar, no tiene complicación alguna: símplemente retornar sin ejecutar nada más. A continuación realizaremos la misma operación con el listener del botón Aceptar:


	// Creamos un nuevo OnClickListener para el boton Aceptar que realice la conexion
	DialogInterface.OnClickListener listenerOk = new DialogInterface.OnClickListener() {

		@Override
		public void onClick(DialogInterface dialog, int which) {
			conectarDispositivo(direccion);
		}
	};

Es importante advertir el calificador “final” que recibe el parámetro “direccion”. ¿Por qué tiene esa característica? Porque de este modo podremos ejecutar el método conectarDispositivo(String direccion) de nuestra Activity desde el propio listener que acabamos de crear. Para poder hacer esto, es requisito indispensable que el parámetro que se le vaya a pasar sea constante, por lo que la cadena de texto con la dirección debe calificarse como final si queremos invocar métodos externos al listener contenidos en la clase que lo define.

Una vez creados los listeners, aún nos faltaría un paso: asociarlos a los eventos onClick() de los botones. Para ello haremos uso de los métodos setPositiveButton() y setNegativeButton(), que reciben como parámetros una cadena con el texto que mostrará el botón y el listener que se asociará al evento:


	// Asignamos los botones positivo y negativo a sus respectivos listeners
	alertDialogBuilder.setPositiveButton("Aceptar", listenerOk);
	alertDialogBuilder.setNegativeButton("Cancelar", listenerCancelar);

Finalmente, cremos el AlertDialog y lo devolvemos:


	return alertDialogBuilder.create();

A modo de resumen, el método completo sería el siguiente:


    private AlertDialog crearDialogoConexion(String titulo, String mensaje, final String direccion)
    {
    	// Instanciamos un nuevo AlertDialog Builder y le asociamos titulo y mensaje
    	AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(this);
		alertDialogBuilder.setTitle(titulo);
		alertDialogBuilder.setMessage(mensaje);

		// Creamos un nuevo OnClickListener para el boton OK que realice la conexion
		DialogInterface.OnClickListener listenerOk = new DialogInterface.OnClickListener() {

			@Override
			public void onClick(DialogInterface dialog, int which) {
				conectarDispositivo(direccion);
			}
		};

		// Creamos un nuevo OnClickListener para el boton Cancelar
		DialogInterface.OnClickListener listenerCancelar = new DialogInterface.OnClickListener() {

			@Override
			public void onClick(DialogInterface dialog, int which) {
				return;
			}
		};

		// Asignamos los botones positivo y negativo a sus respectivos listeners
		alertDialogBuilder.setPositiveButton(R.string.Conectar, listenerOk);
		alertDialogBuilder.setNegativeButton(R.string.Cancelar, listenerCancelar);

		return alertDialogBuilder.create();
    }

La forma de hacer uso de él ya lo hemos visto en un listado anterior. El resultado será algo similar a lo siguiente:

AlertDialog

En los siguientes artículos nos centraremos un poco en la utilización de Bluetooth en Android, para lo cual crearemos una aplicación que mandará pequeños mensajes de una línea entre dos dispositivos, repasando los conceptos de descubrimiento, enlazado (pairing) y envío y recepción de mensajes.

Deja un comentario

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s