La estructura de un proyecto en Android,
es importa saber las carpetas que contiene y donde hay que guardar cada
recurso.
La
carpeta src
Esta es por
defecto la carpeta donde se depositará el código fuente Java, y como en los proyectos para escritorio puede
llamarse de otro modo si nos interesa o podemos disponer de distintas carpetas
fuente, a veces puede ser un modo de enlazar con librerías.
Todo el código que
pongamos en las carpetas fuente será compilado cuando se requiera. Y también
como en los proyectos tradicionales de java el código se organizará en carpetas
que resultaran en paquetes. Recordad que durante el proceso de creación del proyecto definimos el paquete que lo
identificará. Por norma general la estructura de nuestro proyectos
partirá de esta raíz tal como se ve en la imagen.
La
carpeta res
Esa es una carpeta
más compleja ya que se subdivide en múltiples subdirectorios, pero para
resumir, diremos que va a contener lo que en el mundo de Android llamaremos recursos. Ya veremos que existen
distintos tipos de recursos como imágenes,
textos, layouts, y que podemos administrar aquí como se van
gestionar los recursos para dispositivos con características y configuraciones
distintas (densidad de píxel, localización, ect…)
Hay que tener en
cuenta que los archivos que vayamos a crear como recursos deben seguir unanomenclatura determinada ya que
no se va a permitir que el nombre del archivo empiece por un valor
numérico por poner un ejemplo, o que contenga mayúsculas.
La
carpeta gen
Esta es una
carpeta de código fuente que va a
contener archivos de Java como la carpeta src, pero no deberemos agregar o modificar los
archivos contenidos ya que son generados
automáticamente por el plugin de Android a partir del contenido de
la carpeta res. Aquí encontramos el archivo R que es el archivo de java que
servirá para indexar e identificar a todos y cada uno de los recursos de la
carpeta res.
La
carpeta assets
En esta carpeta
depositaremos todos los archivos
que vayamos a querer que acompañen a la aplicación, pueden estar
organizados en carpetas y serán empaquetados en el apk final. Podemos
considerarlos como recursos al igual que el contenido de la carpeta res, pero
no estarán indenxados ni compilados de modo que el acceso a estos es menos
eficiente y algo mas laborioso. Por otro lado no tendremos que aplicar las
reglas de los recursos en lo que respecta a nomenclaturas y organización.
El
archivo AndroidManifest.xml
Podemos decir que
este es el archivo principal y
que todas las aplicaciones o librerías deben contener en laraíz del proyecto. En este, se definen
las características del proyecto como el nombre, paquete o los permisos que va a requerir la aplicación.
También es en este archivo donde se describe los componentes de la aplicación.
Como su nombre
indica podéis imaginar que es un archivo XMO, pero al tener instaladas el
plugin de Android podemos visualizarlo y editarlo a partir de un editor visual
además de sobre un editor de
archivos XML. Si lo abrimos haciendo doble click sobre el se mostrará
probablemente en forma XML, pero podremos navegar por distintas pestañas que
nos mostraran el editor disgregado en secciones tal como se puede ver en la
imagen.
Elementos de la interfaz de usuario
de una aplicación android
Las interfaces de usuario en Android se
pueden implementar de varias formas. Una de ellas es definirla en la propia
clase de la actividad, aunque esta forma, aparte de ser poco elegante y poco
estructurada, no proporciona una diferenciación clara entre el propio código de
la aplicación y el de la interfaz. Por lo que la forma más recomendada y la que
utilizaremos para la implementación de interfaces será mediante XML.
Estas interfaces se construyen a traves de
controles llamados Views que serán el punto de interacción con el usuario. Los
Views son la clase base para la creación de widgets como por ejemplo botones,
campos de texto, checkbox, etc. Por otro lado tenemos la clase ViewGroup que
son contenedores de Views o incluso de otros ViewGroup como muestra la
siguiente imagen.
Tipos de layouts




Los Botones
En el
apartado anterior hemos visto los distintos tipos
de layout con los que
contamos en Android para distribuir los controles de la interfaz por la
pantalla del dispositivo. En las próximas lecciones vamos a hacer un recorrido
por los diferentes controles, y en esta concretamente los de tipo Button
(Botón) que pone a nuestra disposición la plataforma de desarrollo Android.
Vamos
a ver los diferentes tipos y cómo podemos personalizarlos, Android en este caso
nos proporciona tres tipos de botones:
Button: Es
el típico botón normal, contiene un texto y puede contener imágenes de tipo
icono que puedes alinear con el texto.
ToggleButton: es de tipo on/off, contiene una rayita que indica ese on/off.
ImageButton: El botón contiene una imagen, es muy útil para cuando queremos hacer cosas vistosas y de diseño con formas raras, ya que el Button es rectangular, y aquí podemos usar cualquier forma poniendo el fondo transparente.
ToggleButton: es de tipo on/off, contiene una rayita que indica ese on/off.
ImageButton: El botón contiene una imagen, es muy útil para cuando queremos hacer cosas vistosas y de diseño con formas raras, ya que el Button es rectangular, y aquí podemos usar cualquier forma poniendo el fondo transparente.
Imágenes
El control ImageView permite
mostrar imágenes en la aplicación. La propiedad más interesante esandroid:src, que permite indicar la imagen a mostrar.
Nuevamente, lo normal será indicar como origen de la imagen el identificador de
un recurso de nuestra carpeta /res/drawable, por
ejemploandroid:src=”@drawable/unaimagen”. Además de esta
propiedad, existen algunas otras útiles en algunas ocasiones como las
destinadas a establecer el tamaño máximo que puede ocupar la imagen,android:maxWidth y android:maxHeight, o
para indicar cómo debe adaptarse la imagen al tamaño del control, android:scaleType (5=CENTER, 6=CENTER_CROP, 7=CENTER_INSIDE, …).
Además, como ya comentamos para el caso de los controles ImageButton, al tratarse de un control de tipo imagen
deberíamos establecer siempre la propiedad android:contentDescription para
ofrecer una breve descripción textual de la imagen, algo que hará nuestra
aplicación mucho más accesible.
1
2
3
4
5
|
<ImageView android:id="@+id/ImgFoto"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/ic_launcher"
android:contentDescription="@string/imagen_ejemplo"
/>
|
Si en vez de establecer la imagen a mostrar en el
propio layout XML de la actividad quisiéramos establecerla mediante código
utilizaríamos el método setImageResorce(…),
pasándole el ID del recurso a utilizar como contenido de la imagen.
1
2
|
ImageView img=
(ImageView)findViewById(R.id.ImgFoto);
img.setImageResource(R.drawable.ic_launcher);
|
En cuanto a posibles eventos, al igual que
comentamos para los controles de tipo botón en el apartado anterior, para los
componentes ImageView también podríamos implementar su
evento onClick, de forma idéntica a la que ya vimos, aunque
en estos casos suele ser menos frecuente la necesidad de capturar este evento.
Listas
En este nuevo artículo nos vamos a centrar en
el control de selección más utilizado de todos, el ListView.
Un control ListView muestra
al usuario una lista de opciones seleccionables directamente sobre el propio
control, sin listas emergentes como en el caso del control Spinner. En caso de
existir más opciones de las que se pueden mostrar sobre el control se podrá por
supuesto hacer scroll sobre la lista para acceder al resto
de elementos.
Para empezar, veamos como podemos añadir un
control ListView a nuestra interfaz de usuario:
1
2
3
|
<ListView android:id="@+id/LstOpciones" android:layout_width="match_parent" android:layout_height="wrap_content" /> |
Una vez más, podremos modificar el aspecto
del control utilizando las propiedades de fuente y color ya comentadas en
artículos anteriores. Por su parte, para enlazar los datos con el control
podemos utlizar por ejemplo el mismo código que ya vimos para el control Spinner. Definiremos
primero un array con nuestros datos de prueba, crearemos posteriormente el
adaptador de tipo ArrayAdapter y
lo asignaremos finalmente al control mediante el método setAdapter():
1
2
3
4
5
6
7
8
9
10
|
final String[] datos = new String[]{"Elem1","Elem2","Elem3","Elem4","Elem5"}; ArrayAdapter<String>
adaptador = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1,
datos); lstOpciones =
(ListView)findViewById(R.id.LstOpciones); lstOpciones.setAdapter(adaptador); |
NOTA: En caso de necesitar
mostrar en la lista datos procedentes de una base de datos la mejor práctica es
utilizar un Loader (concretamente
un CursorLoader), que
cargará los datos de forma asíncrona de forma que la aplicación no se bloquee
durante la carga. Esto lo veremos más adelante en el curso, ahora nos
conformaremos con cargar datos estáticos procedentes de un array.
En el código anterior, para mostrar los datos
de cada elemento hemos utilizado otro layout genérico de Android para los
controles de tipo ListView (android.R.layout.simple_list_item_1), formado únicamente
por un TextView con unas dimensiones determinadas.
Como podéis comprobar el uso básico del
control ListView es completamente análogo al ya
comentado para el control Spinner.
GRID
Usar
el principio Grid, requiere generalmente que el desarrollador añada algún
margen/paddin/espacio extra entre elementos. En efecto, añadir espacio entre
elementos ayuda a mantener una separación clara entre bloques mientras se
conserva un gran nivel del legibilidad en la interfaz. Todos los
desarrolladores Android están familiarizados con éstos
conceptos, y en la mayoría de los casos se solucionan usando características
Del framework como padding y/o margin en las Views.
Para aislar claramente la lógica del programa de la interfaz, generalmente ésto
se hace en losficheros
XML que definen la interfaz. Si bien éste método funciona cuando la
interfaz es estática, puede se complicado para interfaces dinámicas en las
cuales hay elementos que se muestran o desaparecen según sea necesario. Éste
artículo pretende dar algunos consejos para manejar correctamente interfaces
dinámicas basadas en Grids.
No hay comentarios:
Publicar un comentario