¿Quieres registrarte?

Mostrar una alerta antes del cierre de una aplicación AIR

Por: Zguillez
27 de Enero del 2009
7273 de clabLevel
Otros artículos de Zguillez
2,353 visitas

En este tip mostraré como crear una ventana de alerta cuando le demos al botón de cerrar en una aplicación AIR, teniendo que validar el cierre evitando que se cierre directamente. De esta manera podemos controlar que el usuario cierre la aplicación si haber realizado una operación necesaria, pr ejemplo guardar los cambios realizados en el caso de tratarse de una a aplicación que edite documentos.



Lo primero que deberemos hacer es colocar la función a realizar cuando se detecte el evento de cierre de la aplicación (osea, cuando el usuario cierra la aplicación).

Código :

<mx:WindowedApplication xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute" closing="cerrarApp(event)">


Ahora escribiremos la función. El punto importante aquí es como evitar el cierre de la aplicación, ya que el usuario realmente a clicado en el botón de cerrar. Esto lo conseguimos con el método preventDefault() de la clase Event. Con este método conseguimos que el evento no ejecute las funciones por defecto y por lo tanto no se cierra la aplicación. Lo que haremos en su lugar es abrir una ventana de Alert.

Código :

public function cerrarApp(e:Event):void
{
   e.preventDefault();
   
   Alert.yesLabel = "Si";
   
   Alert.show("¿Realmente quiere salir?","Salir aplicación", Alert.YES | Alert.NO, null, cerrar, null, 2);
}




Con yesLabel decimos que aparezca el texto "Si" en el botón de validar en lugar de "Yes". Y con el 2 al final de los parámetros decimos que el botón seleccionado por defecto sea el segundo, osea el "No".

También le estamos indicando que al clicar sobre cualquiera de los botones se ejecute la función "cerrar" que es la siguiente:

Código :

private function cerrar(e:CloseEvent):void
{
   if(e.detail == Alert.YES)
   {
      this.nativeApplication.exit();
   }
}


Donde le estamos indicando que si el botón seleccionado es el "Si" entonces cierre la aplicación. En el caso de seleccionar el "No" no se ejecuta nada y por lo tanto la aplicación sigue abierta.

Segundo ejemplo



El código anterior se ejecutaría siempre que le demos al icono de cerrar aplicación. Pero lo interesante es poder controlar cuando queremos mostrar esa advertencia.

Por ejemplo en el caso de tener una aplicación que sea un editor de texto. Si le damos al botón de cerrar la aplicación teniendo cambios sin guardar mostraremos el Alert, pero en el caso de haber guardado los cambios previamente cerraremos directamente la aplicación.

Primero crearemos una variable booleana que controlará si la aplicación se cierra automáticamente o requiere mostrar la advertencia.

Código :

private var cierre:Boolean = true;


En la función que se ejecuta al cerrar la aplicación colocaremos un condicional que detecte el estado de esa variable.

Código :

private function cerrarApp(e:Event):void
{
   e.preventDefault();
   
   if(cierre == false)
   {
      Alert.yesLabel = "Si";            
      Alert.show("¿Desea guardar los cambios antes de salir?","Salir aplicación", Alert.YES | Alert.NO | Alert.CANCEL, null, cerrar, null, 3);
   }
   else
   {
      this.nativeApplication.exit();
   }
}




Lógicamente esa función "cierre" la deberemos controla con el resto de funciones de la aplicación. Es decir, todas las funciones que realicen cualquier cambio que deba ser guardado deberán colocar esa variable a "false", y la función que realice el guardado de datos deberá colocar la variable a "true".

La función de cierre quedaría asi:

Código :

private function cerrar(e:CloseEvent):void
{
   if(e.detail == Alert.YES)
   {
      guardarDatos();               
      this.nativeApplication.exit();
   }
   else if(e.detail == Alert.NO)
   {
      this.nativeApplication.exit();
   }
}


De manera que si clicamos "Si" ejecutaríamos la función que nos guarda los datos y cerraríamos después la aplicación, si clisásemos "No" cerraríamos directamente y si clisásemos "Cancel" entonces no se ejecutaría nada y no cerraríamos la aplicación.

Enviar a twitter Enviar a facebook


También te interesa


Etiquetas flex air seguridad mxml

Comentarios | Enviar un comentario
¡Genial! Este tipo de Tips son realmente útiles... Enhorabuena por ello!
(y)
Por: M@U
Excelente tip Z!!!

Cada vez que leo tus tips me dan ganas de programar XD
Por: XKlibur
Jaja. Siempre te luces.

Siempre lo imaginé al revés, que para evitar que cerrara una app tenías que decirselo, y que si querías que continuara cerandose no decirle nada...
Por: Bleend
Muy buen tip, y excelentemente explicado. Gracias. (y)
Por: glsmaster
Muy interesante. ^^ No sabía que se podía hacer.

En cuanto a la usabilidad, salvo en cosas del tipo "¿Quieres guardar los cambios?" hay que ser cuidadoso con este tipo de cosas. Al usuario no le gusta que las cosas no se comporten como él espera. Si por alguna razón es necesario, habría que poner una opción que posibilite que no aparezca el mensajito y se recuerde con SharedObject.
Por: Zah
C00l, este si me enccanta ^^, me hace recordar cuando hacia aplicaciones de escritorio con un lenguaje que ya olvide (VB6) xD.
Por: Otaku RzO
Hola.

Soy novato en flex, trare de crear el ejemplo pero el componente de WindowedApplication como creo??

ya que la propiedad de closin no aparece para Application.


<?xml version="1.0" encoding="utf-8"?>
<mx:WindowedApplication xmlns:mx="http://www.adobe.com/2006/mxml"
layout="absolute" closing="cerrarApp(event)">

<mx:Script>
<![CDATA[
public function cerrarApp(e:Event):void
{
e.preventDefault();

Alert.yesLabel = "Si";

Alert.show("¿Realmente quiere salir?","Salir aplicación", Alert.YES | Alert.NO, null, cerrar, null, 2);
}


private function cerrar(e:CloseEvent):void
{
if(e.detail == Alert.YES)
{
this.nativeApplication.exit();
}
}
]]>
</mx:Script>

</mx:WindowedApplication>
Por: L30N1D4Z
Deja un comentario
IMPORTANTE

Recuerda ser respetuoso, no insultes a otras personas, ni uses palabrotas, hay una persona al otro lado de la pantalla.

Habla bien, NO ESCRIBAS EN MAYUSCULA TODO, no escribas como en un SMS, evita cosas como "ke", "x q" y demás abreviaciones.

Aquí funcionan las etiquetas de los foros, puedes usar [b] para negrita, [img] para las imágenes, [url] para los enlaces, etc.

Si tienes preguntas técnicas, envíalas mejor al foro.