TabNavigator y ModuleLoader

26 agosto, 2010

Bien, este es un tema un poco delicado puesto que si no desarrollamos el ModuleLoader este nos podrá generar un poco de dolor de cabeza y bien nos puede incluir una noche de desvelo. Asi que empecemos por comentar los puntos vitales al momento de trabajar con módulos.

Al momento de utilizar un Module tendremos que utilizar un método, un propiedad y otro método… si así como se lee… un método, una propiedad y otro método, ¿Por qué? cuando se carga un Module dentro de un ModuleLoader este consume memoria entonces primero haremos la solicitud para que se elimine de memoria el Módulo cargado, luego indicamos la url donde está ubicado el nuevo módulo a cargar y por último lo cargamos, si llegásemos a cargar otro módulo entonces utilizaremos esta metodología.

Adicionalmente al momento de trabajar con Módulos nuestro querido Flash Player genera conflicto o simplemente no funcionan de la forma adecuada con algunos contenedores y clases –un ejemplo, los Acordeones solo funcionan una vez y luego se quedan pegados en pantalla, o las PopUp de la clase Alert no emergen en pantalla–, entre los contenedores que generan algún tipo de falla están TabNavigator, Accordion, Alert, entre otros. Por lo tanto tendrás que instanciar algunos objetos del paquete managers, estos objetos los tienes que declarar dentro del archivo principal mxml o as.

En esta prácticEstructura de Archivosa utilizaremos tres archivos, el mxml principal y dos módulos que estarán dentro de una carpeta llamada modulos –su extensión también terminan con mxml pero se diferencia que el icono de los módulos llevan una franja celeste–.

La estructura del código MXML del TabNavigator es la siguiente:

<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute">

   <mx:TabNavigator id="tabNav" width="75%" height="80%" x="150" y="50">

      <mx:ModuleLoader id="primeraVinieta" label="Primera Viñeta" horizontalAlign="center"/>

      <mx:ModuleLoader id="segundaVinieta" label="Segunda Viñeta" horizontalAlign="center"/>

   </mx:TabNavigator>

</mx:Application>

La creación de un módulo es sencillo, dentro del IDE de Flex Builder ingresamos a File > New > MXML Module, luego seleccionamos la carpeta donde estará el módulo. Veamos el código del primer módulo:

<?xml version="1.0" encoding="utf-8"?>
<mx:Module xmlns:mx="http://www.adobe.com/2006/mxml" layout="vertical" width="80%" height="70%"
   horizontalAlign="center">

   <mx:Accordion label="Herramientas de Trabajo" height="150" width="200">
      <mx:VBox label="Politicas de Promociones">

      </mx:VBox>
      <mx:VBox label="Margenes de Maniobra">

      </mx:VBox>
      <mx:VBox label="Aplicaciones Corporativas">

      </mx:VBox>
   </mx:Accordion>

</mx:Module>

La estructura del segundo módulo es la siguiente:

<?xml version="1.0" encoding="utf-8"?>
<mx:Module xmlns:mx="http://www.adobe.com/2006/mxml" layout="vertical" width="80%" height="70%"
   horizontalAlign="center">

   <mx:Accordion label="Manuales" height="150" width="200">
      <mx:VBox label="Manuales de Procedimientos">

      </mx:VBox>
      <mx:VBox label="Manuales de Ingreso">

      </mx:VBox>
      <mx:VBox label="Manuales de Terminales">

      </mx:VBox>
   </mx:Accordion>

</mx:Module>

Perfecto, con esto ya tenemos bastante tela para cortar… dentro del archivo mxml principal declararemos una etiqueta Script y dentro de ella declararemos una función llamada cambioPestania y esta se ejecutará cada vez que el usuario haga clic en algunas de las pestañas del TabNavigator y según sea el valor del selectedIndex así se mandara a llamar el módulo –esta etiqueta la podemos colocar por debajo de la etiqueta Application–, veamos el código:

<mx:Script>
   <![CDATA[

      private function cambioPestania(e:Event):void {
         var almacenaIndex:String = e.currentTarget.selectedIndex;
         switch (almacenaIndex) {
            case "0":
                     segundaVinieta.unloadModule();
                     primeraVinieta.url = "modulos/modulo1.swf";
                     primeraVinieta.loadModule();
                     break;
            case "1":
                     primeraVinieta.unloadModule();
                     segundaVinieta.url = "modulos/modulo2.swf";
                     segundaVinieta.loadModule();
                     break;
         }
      }

   ]]>
</mx:Script>

Las pestañas de un TabNavigator están señalizadas con un índice empezando desde cero y según sea el número de pestaña este valor puede ir incrementando, así que nos aprovecharemos de esta virtud y con e del tipo Event capturaremos el valor de la pestaña con la propiedad selectedIndex y la almacenamos dentro de almacenaIndex del tipo String. Luego con un condicional switch determinamos que módulo cargaremos.

Como mencionamos al principio primero tenemos que utilizar un método para descargar el Módulo cargado en memoria y para ello utilizaremos unloadModule, luego con la propiedad url indicamos el directorio y el archivo a cargar; por ultimo con el método loadModule cargamos el nuevo módulo.

Consideraciones

Es de tener cuidado sobre cual módulo será quitado de la memoria, si observas en el case 0, descargamos el segundo módulo y cargamos el primero, dentro del case 1 quitamos de memoria el primer módulo y procedemos a cargar el segundo. Si no hiciéramos esto la aplicación consumiría memoria innecesaria de la PC.

Si realizas las pruebas haciendo un Debug y navegas por las pestañas veras a continuación que la consola de Flex le imprimirá lo siguiente:

Consola de Flex Builder

Una de las ventajas sobre desarrollar con módulos es que la aplicación solo cargará aquellos módulos que solo requiera utilizar el usuario y no toda la aplicación.

Esta vez cambiaremos la metodología y no presentaremos el código completo tal como lo hemos hecho en los Post anteriores, sino que proporcionaremos directamente el código para que lo puedas descargar y exportar a tu IDE. Descárgalo aquí!!!!

Hola, espero te haya gustado y te sea util la información que hayas encontrado, esperamos que sigas aprendiendo y te invito a que revises todo el blog. Mientras agilizare el proceso de edición de información dentro del blog para que puedas encontrar diversos temas referentes a Flex Builder 3 y ActionScript 3.0.

Apoya al proyecto rias4u ingresando aquí!!! =D


Actualización de los ComboBox

16 agosto, 2010

Para este ejercicio utilizaremos un XML como fuente de datos externa y con ella poblaremos la información de dos Combo Box utilizando el HTTPService. Pero primero veamos el XML que utilizaremos.

<?xml version="1.0" encoding="utf-8"?>
<carrera>
   <curso periodo="Ciclo I">
      <materia>Estadística I</materia>
      <materia>Filosofía de la Calidad</materia>
      <materia>Física I</materia>
      <materia>Matemática I</materia>
      <materia>Psicología Social</materia>
   </curso>
   <curso periodo="Ciclo II">
      <materia>Estadística II</materia>
      <materia>Física II</materia>
      <materia>Matemática II</materia>
      <materia>Programación I</materia>
      <materia>Tecnología de la Información I</materia>
   </curso>
   <curso periodo="Ciclo III">
      <materia>Análisis de Sistemas I</materia>
      <materia>Base de Datos I</materia>
      <materia>Programación II</materia>
      <materia>Sistemas Operativos</materia>
      <materia>Tecnología de la Información II</materia>
   </curso>
   <curso periodo="Ciclo IV">
      <materia>Análisis de Sistemas II</materia>
      <materia>Base de Datos II</materia>
      <materia>Programación III</materia>
      <materia>Diseño Web</materia>
      <materia>Tecnología de la Información III</materia>
   </curso>
</carrera>

Primero declararemos la etiqueta HTTPService dentro del MXML, como necesitamos identificar esta etiqueta entonces utilizaremos la propiedad id, a la vez le especificaremos el nombre del archivo de XML e indicaremos el tipo de formato estándar e4x.

<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute">

   <mx:HTTPService id="cargaXML" url="recursos/materias.xml" resultFormat="e4x"/>

Dentro de la etiqueta Application mandamos a llamar un CreationComplete para solicitar los datos del XML utilizando el método send de HTTPService.

<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute" creationComplete="cargaXML.send()">

Luego declaramos el primer ComboBox, este será nombrado como cboCiclo y el dataProvider poblara la información que entregue el HTTPService cargaXML. Recuerda que la propiedad lastResult solo puede ser utilizada cuando usamos un HTTPService y con la ayuda del formato e4x señalamos la etiqueta que vamos a utilizar –en este caso la etiqueta curso–.

<mx:ComboBox id="cboCiclo" x="10" y="10" dataProvider="{cargaXML.lastResult.curso}" labelField="@periodo" change="changeCboMateria(event)" prompt="Elija un periodo..."/>

Con el  método labelField extraemos el valor de la propiedad periodo del XML y a la vez usamos el evento Change que se activará al momento que el usuario hace clic sobre algún elemento del ComboBox. Para efectos de estética utilizamos la propiedad prompt para que el ComboBox nos imprima por primera vez la leyenda “Elija un periodo…”.

Necesitamos incluir el código ActionScript para que nos de la funcionalidad de actualización y para ello utilizaremos la etiqueta Script que puede ir por debajo de la etiqueta de apertura Application. Dentro de ella vamos a declarar una variable Bindable actualizaCboMateria del tipo XMLList, y declaramos la función changeCboMateria. La función a ejecutarse asigna a la variable actualizaCboMateria el nuevo contenido que poblara al segundo ComboBox cboMateria, esto a través de la propiedad selectedItem. Este contenido asignado será utilizado dentro del dataProvider del segundo ComboBox.

<mx:Script>
   <![CDATA[
      [Bindable]
      private var actualizaCboMateria:XMLList;

      private function changeCboMateria(e:Event):void {
         cboMateria.visible = true;
         cboMateria.includeInLayout = true;
         actualizaCboMateria = cboCiclo.selectedItem.materia;
      }
   ]]>
</mx:Script>

En el código anterior, las propiedades visible e includeInLayout es para hacer la solicitud de imprimir en pantalla el ComboBox cboMateria, esto es para darle una mejor interactividad al ejercicio. Veamos el segundo ComboBox:

<pre><mx:ComboBox id="cboMateria" x="10" y="40" dataProvider="{actualizaCboMateria}" visible="false" includeInLayout="false"/></pre>

Con esto, al seleccionarse un elemento del primer ComboBox este actualizará de forma automática el segundo ComboBox. Recuerde que el Documento XML tiene que estar bien formado. Veamos como quedo el código final:

<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute" creationComplete="cargaXML.send()">

   <mx:Script>
      <![CDATA[
         [Bindable]
         private var actualizaCboMateria:XMLList;

         private function changeCboMateria(e:Event):void {
            cboMateria.visible = true;
            cboMateria.includeInLayout = true;
            actualizaCboMateria = cboCiclo.selectedItem.materia;
         }
      ]]>
   </mx:Script>

   <mx:HTTPService id="cargaXML" url="recursos/materias.xml" resultFormat="e4x"/>

   <mx:ComboBox id="cboCiclo" x="10" y="10" dataProvider="{cargaXML.lastResult.curso}" labelField="@periodo" change="changeCboMateria(event)" prompt="Elija un periodo..."/>

   <mx:ComboBox id="cboMateria" x="10" y="40" dataProvider="{actualizaCboMateria}" visible="false" includeInLayout="false"/>

</mx:Application>

Hola, espero te haya gustado y te sea util la información que hayas encontrado, esperamos que sigas aprendiendo y te invito a que revises todo el blog. Mientras agilizare el proceso de edición de información dentro del blog para que puedas encontrar diversos temas referentes a Flex Builder 3 y ActionScript 3.0.

Apoya al proyecto rias4u ingresando aquí!!! =D



Seguir

Get every new post delivered to your Inbox.