lunes, 16 de septiembre de 2013

Interfaz de usuario Android: Layouts básicos 2

AbsoluteLayout

Este contenedor posiciona los elementos de forma absoluta. Lo que quiere decir que  indicaremos la posición (x,y) de las vistas que insertemos dentro de este. Esto hace que sea más complicado de mantener y menos flexible que los demás tipos de contenedores. Por eso ha quedado obsoleto y no se recomienda su uso.

TableLayout

Este contenedor permite dividir el espacio disponible en forma de tabla, definiendo las columnas  y especificando el lugar donde se posicionarán sus vistas hijas en la tabla. Al igual que pasa con muchas de los atributos vistos, la definición de la tabla se asemeja a como la definiríamos en HTML. Pero a diferencia de como se define una tabla en HTML, ahora solo crearemos filas (elemento TableRow) y cada vista que coloquemos en ellas se corresponderá con una columna. Evidentemente en cada fila podremos insertar las vistas que queramos, independientemente de que en otra fila hayamos insertado más o menos. Por lo tanto para saber el total de columnas que tiene  el contenedor miraremos la fila que tiene más columnas.

Interfaz de usuario Android: Layouts básicos 1

LinearLayout

Contenedor que posiciona sus vistas (Views) una detrás de otra. Configurable para que  esta colocación sea horizontal (uno detrás de otro) o vertical (uno debajo de otro). Por lo tanto su atributo más importante es: android:orientation:”horizontal|vertical”.  Las vistas empezarán a colocarse en la esquina superior izquierda de la pantalla. Actualmente es uno de los contenedores más utilizados.

Hay 3 atributos muy importantes que tendrán las vistas que se encuentren dentro de un contenedor de tipo LinearLayout y que nos ayudarán a su colocación (de las vistas):
A) Los atributos android:layout_width y android:layout_height explicados en un tutorial anterior.
B) El atributo android:layout_weight (valor por defecto 0) indica que proporción del espacio restante en el contenedor será adjudicado a una vista. Por lo tanto permite dar a las vistas de un LinearLayot unas dimensiones proporcionales entre ellas. Esto quiere decir que si al atributo android:layout_weight de una vista le asignamos el valor “1” y al mismo atributo de otra vista le asignamos “2”, esta última ocupará el doble del espacio libre que la primera.
Hay que tener en cuenta que el resultado de modificar este atributo depende del valor del atributo del contenedor  android:orientation. Ya que si el valor es “vertical” las vistas crecerán en altura para adquirir el espacio extra proporcional. Sin embargo si el valor de la orientación del contenedor es “horizontal”, las vistas crecerán en anchura.

domingo, 15 de septiembre de 2013

El archivo AndroidManifest.xml

En el tutorial anterior la estructura de directorios que tiene un proyecto Android. Y comentamos la importancia de dichos directorios y de los archivos que incluyen. Vamos a presentar el archivo más importante de cada proyecto y que deberá de estar presente en la raíz del proyecto: AndroidManifest.xml.
Dicho archivo es generado automáticamente y modificable gráficamente o  programando. Y por lo tanto es importante conocerlo. Ya que el archivo presenta información esencial sobre la aplicación al sistema operativo Android. Información necesaria para que pueda ejecutar la aplicación.

Principales tareas que realiza AndroidManifest.xml:

- Utiliza el nombre de paquete Java como identificador único de la aplicación.
- Describe los componentes de la aplicación: Actividades, servicios, proveedores de contenido... Para ello utiliza el nombre de las clases que implementan cada uno de estos componentes y publica sus capacidades. Esto permite al sistema operativo conocer que componentes tiene y bajo que condiciones pueden ser lanzados.
- Especifica que permisos tiene la aplicación para acceder a partes protegidas del API que proporciona el sistema Android.
- Declara la mínima versión del sistema operativo en el que funcionará la aplicación.
- Indica las librerías que utiliza el proyecto y por lo tanto tienen que ser empaquetadas al crear la aplicación.
- Permite declarar  una clase 'Instrumentation' que sirve para monitorizar la interacción de la aplicación con el sistema. Esta declaración solo estará presente mientras se desarrolla y prueba la aplicación. Ya que será borrada antes de que la aplicación se vaya a publicar.

miércoles, 11 de septiembre de 2013

Estructura de un proyecto Android

Cuando creamos un nuevo proyecto para Android, ya sea desde eclipse o desde el nuevo Android Studio, se nos crearán una serie de directorios necesarios para posteriormente generar/compilar la aplicación.Vamos a repasar brevemente esa estructura de directorios y nos centraremos en uno de los directorios más importantes a la hora de crear una aplicación: el directorio de recursos.
Estructura de un proyecto Android

Conceptos básicos de Android

Hay 4 bloques/componentes que debemos conocer y que pueden estar presentes, a la vez, en una aplicación Android:

1. Actividad

Cada actividad esta implementada como una simple clase Java que extiende (hereda) de la clase Activity de Android. Una actividad se encargará de mostrar una interfaz de usuario o pantalla gráfica, compuesta de vistas (cada unos de los elementos de la pantalla), y de tratar los eventos sobre estas vistas. Por cada pantalla que necesite una aplicación definiremos una actividad. Por ejemplo una actividad para listar contactos, otra para ver el detalle del contacto elegido y otra para enviar mensajes.
Cuando volvemos atrás en la aplicación, la interfaz es pausada y puesta en una pila. Con lo estamos devolviendo el control a la actividad que controlaba la anterior interfaz. Por lo tanto podemos definir las actividades como los controladores en la arquitectura MVC que utiliza Android.
En el fichero AndroidManifest.xml deberemos especificar todas las actividades de la aplicación, y cual va a ser la que se iniciará con la aplicación.

martes, 10 de septiembre de 2013

Interfaz de usuario Android: Conceptos

Introducción

En el patrón  MVC definiremos, a groso modo, la vista como la visualización del modelo. Más específicamente, la vista es la porción de una aplicación responsable del renderizado  de los elementos visuales y de enviar la interacción del usuario con dicho elementos a otro componente de la arquitectura. La vista es también llamada coloquialmente como interfaz de usuario. Y como Android sigue este patrón, en el que se pretende separar los datos de la lógica, lo correcto es utilizar el mecanismo que proporciona Android para definir la interfaz de usuario: ficheros de diseño basados en XML.
Cada uno de estos ficheros se crearán en el directorio res/layout/ de nuestro proyecto. Y cada uno de ellos se corresponderá con una 'pantalla' gráfica de la aplicación.
Todos los elementos gráficos que se renderizarán en una 'pantalla' son subclases de una clase llamada View, por lo tanto, a partir de ahora a dichos elementos gráficos (campos de texto, botones, imágenes) que formarán la interfaz de usuario les llamaremos vistas.

jueves, 5 de septiembre de 2013

Lista de tareas simple con Symfony 2: Parte 5

Continuación de la página Insertar Tarea

1. Validación del formulario

La validación del formulario se realiza en la entidad asociada, Tarea en nuestro caso, ya que será la que recibirá directamente los datos del formulario y será la que valide sus restricciones.

 /*src/Tarea/ListadoBundle/Entity/Tarea.php*/  
 ….  
  public static function loadValidatorMetadata(ClassMetadata $metadata) {  
     $metadata->addPropertyConstraint('descripcion', new Assert\NotBlank(array(  
       'message' => 'This value should not be blank.'  
     )));  
     $metadata->addPropertyConstraint('descripcion', new Assert\MinLength(12,array(  
       'message' => 'This value is too short. It should have {{ limit }} character or more.'  
     )));  
     $metadata->addPropertyConstraint('fechaRealizar', new Assert\Date(array(  
       'message' => 'This value is not a valid date.'  
     )));  
   }  

En está función estática se añadirán las restricciones sobre cada campo del formulario y sus mensajes de error. Está función será la encargada de comprobar si son válidos los datos enviados junto al formulario y será llamada desde el controlador. Dicho controlador la llamará internamente mediante $form->isValid(). Por lo tanto una vez se envíe el formulario se validará (validación en el servidor).

Lista de tareas simple con Symfony 2: Parte 4

Página Insertar Tarea

Primero de todo vamos a crear una nueva entrada en la configuración de enrutamiento:

 #src/Tarea/ListadoBundle/resources/config/routing.yml  
 ...  
 insertar:  
   pattern: /insertar  
   defaults: { _controller: TareaListadoBundle:Tarea:create }  
   requirements:  { _method: "GET|POST" }  

Podemos ver que la acción se llamará cuando la url del navegador se corresponda con localhost/../insertar y que vamos a usar el mismo controlador (TareaController) pero esta vez llamando al método create.
Es importante especificar que la página podrá ser llamada mediante GET para acceder al formulario y mediante POST, cuando el formulario envíe datos al servidor. Por lo tanto hay que especificar ambos métodos en los requisitos.

A continuación vamos a crear el formulario de inserción de una tarea. Symfony 2 viene incluye un componente para formularios muy potente que facilita la tediosa tarea de tratar con formularios. Y recuerda que, como ocurre con todos los componentes de Symfony2, lo puedes utilizar fuera de Symfony2 en tus propios proyectos.

miércoles, 4 de septiembre de 2013

Lista de tareas simple con Symfony 2: Parte 3

Vista de la página principal

Podríamos recurrir a un método muy común utilizado con PHP  que consiste en  incluir un 'header' y un 'footer' en cada una de las plantillas con las partes que se repiten en todas las páginas/vistas. Sin embargo es recomendado utilizar el motor de plantillas Twig que incorpora Symfony2. Y aprovechar la posibilidad que proporciona de heredar plantillas.

Vamos a ver una breve introducción a algunos conceptos Twig:

A) Sintaxis en TWIG:

- {{.....}} es utilizado para imprimir una variable o expresión en la plantilla.
- {%....%} es utilizado para controlar la lógica de la plantilla. Por lo tanto dentro insertaremos las condiciones y o los bucles for, foreach...
- {#...#} es utilizado para insertar comentarios. Equivalente al comentario multilinea de /**/ de PHP.

Lista de tareas simple con Symfony 2: Parte 2

Vamos a continuar con la creación de la página principal de nuestra lista de tareas.

Controlador de la página principal

Después de definir la entidad, crear su tabla correspondiente en la base de  datos y de añadir algunos datos de prueba, ya podemos implementar nuestro controlador. Para ello vamos a asociar la ruta de la que será nuestra página principal, con el controlador que se va a encargar de tratar con el modelo y renderizar la vista. Por lo que vamos a modificar el fichero ListaCompraBundle/Resources/config/routing.yml .

Por norma, el nombre de un controlador (clase) llevará el sufijo Controller  y nombre de la acción (método de la clase) llevará el sufijo Action.

El controlador encargado de tratar el patrón de ruta '/' va a ser ListadoController.php y  el método, que invocará el controlador, encargado de ejecutar la acción va a ser indexAction. Además le indicaremos que el acceso a dicha ruta se realizará mediante peticiones GET.

 #src/Tarea/ListadoBundle/Resources/config/routing.yml  
 homepage:  
   pattern: /  
   defaults: { _controller: TareaListadoBundle:Tarea:index }  
   requirements:  { _method: "GET" }  

martes, 3 de septiembre de 2013

Lista de tareas simple con Symfony 2: Parte 1

En el tutorial anterior vimos una breve introducción a la estructura de un proyecto Symfony 2. En este y en la siguiente serie de tutoriales vamos a construir una simple lista de tareas con Symfony 2. Iremos explicando paso a paso la creación de una aplicación simple. Y los componentes que la forman.

A la hora de desarrollar una aplicación debemos de tener claro las acciones que va a realizar la misma y mediante que URL's vamos a invocarlas. Ejemplo de URL's que podremos hacer en nuestra aplicación.

URL                                        Action
-------------------------------------------------------------
/                                              Listar tareas (página principal)
/insertar                                   Insertar una tarea
/eliminar/x                                Eliminar la tarea x
/editar/x                                   Editar la tarea x

Creación de la página principal

Configurar la base de datos

Antes de comenzar realmente, tendrás que configurar tu información de conexión a la base de datos. Por convención, esta información se suele configurar en el archivo app/config/parameters.yml aunque también puedes cambiarla desde el navegador entrando en http://localhost/.../web/app_dev.php (esta es la ruta completa si no has configurado el host virtual para el DocumentRoot) y entrando en el apartado configure.

El resultado es un fichero similar a este:

 parameters:  
   database_driver: pdo_mysql  
   database_host: 127.0.0.1  
   database_port: null  
   database_name: tareas  
   database_user: root  
   database_password: tu_password 
   mailer_transport: smtp  
   mailer_host: 127.0.0.1  
   mailer_user: null  
   mailer_password: null  
   locale: en  
   secret: e6ea6da2ce387ebafd55fe3296eeb3a4  
   database_path: null  

lunes, 2 de septiembre de 2013

Introducción a Symfony 2

Symfony y Bundles

Un Bundle es un directorio con una estructura bien definida donde colocaremos los elementos de la arquitectura MVC de un proyecto Symfony 2. Podemos comparar a nivel de concepto los bundles con los plugins de Joomla (por ejemplo).
La primera idea que debe quedar clara, expresada de manera simplista, es que “todo es un bundle” en Symfony2. Por tanto, si queremos desarrollar una aplicación necesitaremos, por lo menos, tener un bundle para alojar el código de la misma. Gracias a este concepto, la distribución de nuestra aplicación o la utilización de funcionalidades de aplicaciones de terceros es muy sencilla.

Nota: También hay que tener en cuenta que la creación de un Bundle significa la creación de un espacio de nombres (enlace a tut. espacio de nombres). Que tendremos que tener en cuenta a la hora de ir creando la aplicación.

domingo, 1 de septiembre de 2013

Symfony 2: Instalación y configuración

Antes de ver los distintos métodos de instalación y actualización, tenemos una lista de requisitos que debemos de cumplir para llevar a cabo dicha tarea.

Requisitos obligatorios:
- PHP debe ser una versión mínima de PHP 5.3.3
- Servidor web (como apache)
- Es necesario habilitar JSON
- Es necesario tener habilitado el ctype
- PHP.ini debe tener configurado el valor date.timezone

Si deseas utilizar Doctrine, necesitarás tener instalado PDO. Además, es necesario tener instalado el controlador de PDO para el servidor de base de datos que desees utilizar.