{{indexmenu_n>1}} ===== Ejemplo Menú Botones ===== \\ Ejemplo de menú con botones que despliegan subopciones. Este menú sustituye al APPWIZARD, de forma que podamos personalizar a nuestro gusto los menús de la aplicación.\\ \\ ^ Vista del menú en Android ^ Vista del menú desplegado ^ | {{ :Demos:Menus:Menu1:menu_colapsado.png?300&nolink }} | {{ :Demos:Menus:Menu1:menu_desplegado.png?300&nolink }} | ^ Vista de los frames de la demo ^ | {{ :Demos:Menus:Menu1:menu_frames_explicacion.png?nolink }} | ==== Descarga el ejemplo ==== NOTA: Se ha desarrollado en un teléfono (800*480) con orientación vertical, simplemente como ejemplo de desarrollo.\\ \\ {{ http://www.xoneisp.com/xonewiki/data/demos/menu1_botones_subopciones.rar | Descarga Ejemplo }} ==== Explicación del código ==== === 1.- Login automático === Lo primero que llama la atención es que la aplicación NO pide usuario y contraseña para entrar en la aplicación, esto se puede conseguir teniendo un usuario "admin" sin contraseña en la tabla de usuarios de la Base de Datos, además, en el mappings, dentro del nodo APP, hemos de especificar el atributo **autologon="true"**. {{:Demos:Menus:Menu1:usuario_admin_bd.png?nolink}} === 2.- Sustituir APPWIZARD === Para sustituir al APPWIZARD, tendremos que definir una colección en el fichero mappings.xml, con el diseño de menú que queremos mostrar. En el nodo APP, hemos de especificar en el atributo **entry-point="NOMBRE_COLECCION_MENUS"**, el nombre de la colección donde hemos definido el menú. === 3.- Resolución de las imágenes === A la hora de diseñar nuestros menús, hemos de tener en cuenta los distintos dispositivos y resoluciones que tenemos hoy en día en el mercado. Para ello, tomamos como base un dispositivo para hacer nuestro diseño, en el ejemplo hemos tomado un dispositivo con una resolución de 800x480 píxeles.\\ \\ Toda nuestra aplicación la realizaremos para ésta resolución y en el nodo APP especificaremos los atributos **resolution-width="480"** y **resolution-height="800"**. Estos atributos nos permiten que nuestra aplicación se reescale automáticamente si utilizamos otro dispositivo con diferente resolución, de forma que el framework se encarga automáticamente del reescalado.\\ \\ Utilizar preferentemente dispositivos con una resolución alta (1920x1080, full hd) para desarrollar la aplicación, pues hacer que las imágenes grandes se reescalen a una resolución más pequeña no supone ningún problema, sin embargo, cuando unas imágenes pequeñas haya que reescalarlas para verlas en un dispositivo con mayor resolución, provocará que las imágenes se vean pixeladas. === 4.- Código de la colección menús === \\ |< 100% 8% 92% >| ^ Código ^ Explicación ^ | **special="true"** | Este atributo, a nivel de nodo COLL, nos permite que NO se ejecute ninguna SQL contra la Base de Datos para obtener los valores de la colección. | | **notab="true"** | Este atributo, a nivel de nodo COLL, nos permite que NO se muestren las posibles pestañas(group) que pudiese haber. | | **bgcolor="#00FFFFFF"** | Los dos primeros dígitos del color nos especifican la **OPACIDAD**, en este caso 00, con lo cual es transparente y no se muestra el color. | | **MAP_SUBOPCION** | Este campo Numérico que tenemos invisible, lo utilizaremos como campo bandera para que sepamos que submenú hemos de mostrar, en principio vale 0 y NO se muestra ningúna subopción. | | **scroll="true"** | Utilizado en el **frame1**, para que si hay muchas opciones/subopciones, se haga scroll. Se ha puesto únicamente en este frame, para que el resto siga apareciendo en pantalla sin que se vean afectados por el scroll. | | **Subopciones1/2** | Este frame lo hemos utilizado para englobar las subopciones y poder así mostrarlas u ocultarlas todas a la vez. Tiene especificado el atributo **disablevisible="MAP_SUBOPCION<>1"** que especifica la condición para que se oculten las subopciones, en este caso las subopciones permanecerán invisibles MIENTRAS MAP_SUBOPCION sea distinto de 1. Los caracteres < y > hemos de codificarlos así puesto que al estar dentro de un XML, no podemos poner los símbolos de < y > para que no crea que estamos cerrando o abriendo un nodo XML.\\ NOTA: Este frame lo hemos utilizado por comodidad y a modo de ejemplo, intentar evitar en la medida de lo posible el uso de frames, puesto que una mayor complejidad de la estructura visual de la aplicación implicará un mayor tiempo de "repintado", cada vez que algún campo cambie y provoque un refresco de la pantalla. | | **method="executenode(toggleMENU(1))"** | Utilizado en los botones de las opciones principales, llamamos al nodo "toggleMENU" y le pasamos como parámetro la opción en la que hemos pulsado. | | **show-wait-dialog="false"** | Utilizado en el nodo "toggleMENU", para que no muestre el mensaje "CARGANDO..." mientras está ejecutándose el script que hayamos definido. | | **method="executenode(abrirCOLL('Clientes'))"** | Utilizado en los botones de las subopciones, llamamos al nodo "abrirCOLL" y le pasamos como parámetro la colección que queremos abrir. | | **appData.userinterface.openmenu coll,26,1** | Utilizado en el nodo "abrirCOLL" para abrir una colección, los atributos son "colección", máscara(permisos) y modo (0-listado, 1-edición). Ver más información de los valores de la máscara [[http://www.xoneisp.com/xonewiki/doku.php?id=b.-programacion:b02.-menus-aplicacion:start#mask_valor |Aquí]] | ==== Ejemplo de código de la colección de menús: ====