jueves, 10 de febrero de 2011

Construir Vistas de Android por Código

El día de hoy les quiero compartir una forma de construir vistas dinámica-mente mediante código en la plataforma android. Para android, una vista (View) es un objeto que ocupa espacio dentro de la pantalla que se esta desplegando. Puede ser un cuadro transparente, un cuadro de color, un botón, un contenedor (ViewGroup), etc.; todas estas vistas se construyen a partir de un mismo objeto base (View) y pueden ser establecidas en una Actividad como la interfaz que sera desplegada al usuario dentro de la aplicación. Una de las grandes ventajas de la plataforma es la construcción de estas vistas a partir de un archivo XML, esta funcionalidad es de gran ayuda al momento de desarrollar una aplicación; creo que todos han visto una linea de código parecida a esta dentro de una actividad de android (esta linea se escribe por defecto cuando se crea un nuevo proyecto utilizando el plugin de eclipse):

setContentView(R.layout.main);

Este código lo que nos dice básicamente es establecer el contenido del archivo XML main.xml como la vista principal de nuestra actividad. Dentro del archivo main existe una definición para la vista que sera construida y posicionada en nuestra actividad en tiempo de ejecución; este archivo puede contener Textos, Botones, Combos, Layouts y cualquier otra Vista existente dentro de la plataforma, incluso podemos crear nuestra propia vista y declararla dentro de nuestro archivo XML (pero ese es tema para otro post). Los archivos de layout (como los llaman comúnmente) nos ahorran muchas lineas de código al momento de estar escribiendo una aplicación, podemos definir infinidad de vistas y adjuntar las a nuestra actividad para que sea desplegada (solo recuerden que entre mas vistas estén especificadas en el archivo mas tiempo tardara la aplicación en inflar el archivo). Pero que pasa si una vista necesita ser generada dinámica-mente antes de ser desplegada, como por ejemplo una tabla con un numero indeterminado de renglones, o un formulario desplegando los datos de un contacto seleccionado; no podemos generar una vista diferente para todas las posibles opciones de contacto o de numero de renglones por lo tanto tenemos que construir nuestra interfaz en tiempo de ejecución con los datos que necesitamos. Para hacer esta tarea tenemos varias opciones, una es crear todas las vistas necesarias por medio de código e ir ajuntando las y construyendo nuestra interfaz por medio de funciones (un poco a lo que se hacia en los lenguajes de programación viejos antes de tener los tan adorados WYSIWYG), como por ejemplo:
con este código crearíamos una tabla con varias columnas cada una con un texto relacionado con nuestro contacto, mas sin embargo imaginen las lineas de código necesarias para construir una vista compleja como un formulario o una tabla con encabezado y pie de pagina, etc. Es por eso que los archivos de layout son muy utiles y donde la clase LayoutInflater juega un papel importante. Esta clase nos permite construir una vista a partir de un archivo XML especificado como un recurso, esta vista la podemos manipular a nuestro antojo antes de que sea adjuntada a una actividad y así poder ahorrar mucho código al momento de estar creando la interfaz para el usuario; como ejemplo les adjunto como seria construir la misma interfaz pero utilizando la clase LayoutInflater:

Lo primero que tenemos que hacer es crear un archivo xml definiendo nuestra tabla principal y sus parámetros, el cual quedaría mas o menos así (archivo table.xml):



luego creamos un archivo xml con la definición de nuestras filas, este se vería mas o menos así (archivo row.xml):

y por ultimo creamos nuestra vista:




Como verán, de esta manera nos ahorramos mucho código ademas de que los archivos xml pueden ser reutilizados en alguna otra actividad o vista para desplegar otra información en un mismo formato. También vean que no es necesario agregar cada uno de los TextView que retraemos de nuestra nueva fila a nuestro objeto TableRow, ya que en nuestro archivo xml ya esta establecido que esta vista pertenece a una vista superior (al momento de ser un elemento xml interno). También los ids pueden ser cambiados por ids globales de aplicación que quedaran registrados en la clase R al utilizar la notación android:id="@+id/identificador" en el archivo XML. Con esta técnica se pueden construir Vistas muy complejas de una manera sencilla, solo recuerden que entre mas compleja es la vista mas tiempo tardara la aplicación en inflarla, es por esto que yo les recomiendo inflar vistas muy grandes dentro de una tarea asíncrona (otro día publicare como realizar esta acción). Para terminar les dejo como se vería esta vista que acabamos de construir, un saludo.

Por cierto si quieren que les envié el código completo de este pequeño ejemplo no duden en escribir un comentario o escribirme un correo electrónico

.

9 comentarios:

  1. Hola amigo que tal, oye necesito tu codigo fuente porfa, mi correo es: david_06b@hotmail.com

    ResponderEliminar
  2. Saludos cordiales, muy interesante tú propuesta de construcción de vistas, por favor me ayudas con el código fuente mi correo es : ccalispa@yahoo.es,

    ResponderEliminar
  3. hola que tal amigos, el codigo lo pueden ver desde mi cuenta de github en.

    https://github.com/ti3r/View-With-Plain-Code

    y el link de descarga es el siguinte:
    https://github.com/ti3r/View-With-Plain-Code/downloads

    ResponderEliminar
  4. Interesante, lo hice para hacer un formulario, pero como puedo acceder a los valores de (EditText), para grabarlos... haber si me puedes ayudar. SAlidos

    ResponderEliminar
    Respuestas
    1. Hola que tal Amigo, para guardar valores tendrias que crear propiedades para los text edit que quieres accesar y exponerlas a travez de un metodo get. No se si esto resuelva tu pregunta. Si no puedes mandame un correo y con gusto puedo buscar algun tiempo libre para preparar un ejemplo.

      Eliminar
  5. Necesito hacer algo parecido pero con varios LinearLayout dentro de un HorizontalScrollView, los LinearLayout se encuentran en diferentes archivos xml

    ResponderEliminar
    Respuestas
    1. Tendrias que agregar ls vistas de los diferentes archivos xml a tu vista pricipal. Por ejemplo crear un horizontalScrollView y luego inflar los distintos archivos que posees e irlos agregando a tu horizontalScrollView principal. Despues de eso regresar tu horizontal view y listo

      Eliminar
  6. Muy interesante, ¿como se podría eliminar una fila en concreto?¿como recorro la tabla para extraer los datos de una columna?

    ResponderEliminar
    Respuestas
    1. Para recorrer la tabla y extraer datos va a ser necesario agregar metodos a nestro codigo para retraer los valores desde nuestros contactos. por ejemplo getApellido(int x) y dentro de ese metodo tendriamos que agregar return contactos[X].getApellido(). Algo similar a esto espero que te funcione

      Eliminar