Ficheiros e cartafoles dun proxecto Android: Ola Mundo. Activities, Layouts e Múltiples pantallas
Introdución
- Neste apartado vanse describir os cartafoles e ficheiros máis esenciais dos que se compón un proxecto Android.
- Comezaremos creando un proxecto: OlaMundo, e estudaremos as partes nas que se divide.
- Os proxectos vanse nomear e numerar da seguinte forma: U2_XX_NomeDaAplicación, para facilitar o seguimento. Sendo U2 a unidade 2 e XX o número de proxecto dentro da Unidade.
- Estes van estar no seguinte cartafol <ruta até o cartafol>/ProxectosEclipse/PlategaAndroid/Unidade2/<proxectos>
- Esa ruta pode ser a ruta ao Workspace, ou
- Pode ser unha ruta fóra do Workspace.
Crear un proxecto Android: OlaMundo
Activities
- Imos dar unha breve descrición do que é un Activity. Estas veranse máis adiante.
- Unha Activity é unha pantalla única coa cal o usuario poderá interactuar a través dos elementos que nela se dispoñan.
- Unha aplicación estará composta dunha ou varias Activities.
- Incluso se pode saltar da Activity dunha aplicación á unha Activity calquera de outra aplicación. Por exemplo, cando se usa WhatsApp e se accede a consultar os datos dun contacto.
- Unha Activity pode ser chamada cando se inicia unha aplicación, dende outra aplicación, ou cando se recupera a aplicación.
- Unha Activity pode ser destruída pola propia aplicación, cando se preme o botón Back do dispositivo ou polo sistema porque está na pila de aplicacións en segundo plano e se necesitan os recursos que está consumindo.
- As Activities teñen un ciclo de vida como se expón dun xeito simple na seguinte imaxe:
Nun punto posterior afondarase sobre as Activities.
- Referencias:
Layout
- Un layout é un panel onde se definen os elementos gráficos que compoñen unha Activity: botóns, listas depregables, etiquetas, etc.
- Un Layout pode declararse en ficheiros XML ou en tempo de execución. Comezaremos polos ficheiros XML.
- Un Layout poden ser de varios tipos: lineais, táboa, grid, etc. Como se verá no seguinte apartado.
- Referencias:
Soporte múltiples pantallas
- Como sabemos no mercado hai distintos dispositivos: teléfonos, tablets, etc. e agora ... coa nova versión Lollipop: reloxos, pulseiras, TVs, etc.
- Cada un ten os seus tamaños e resolucións.
- Android proporciona ferramentas para adaptarse a toda esa variedade. Por exemplo, poderíamos deseñar unha aplicación cuxa Interface Gráfica fose distinta dun teléfono a unha tablet, o se está en apaisado o teléfono ou en vertical.
- O sistema tamén trata de escalar a aplicación para adaptala aos distintos tipos (Tamaños/resolucións) de pantalla, pero se usamos pixels para definición dos elementos que compoñen unha pantalla pode pasar o seguinte:
- Os dispositivos teñen o mesmo tamaño de pantalla,
- A resolución dos dispositivos vai de menor a maior (de esquerda á dereita).
- Observar como ao definir que un obxecto ocupa X*Y píxeles estes obxectos son máis pequenos a medida que a resolución da pantalla é maior.
- Observar que se ven afectados os tipos de recursos gráficos:
- Os creados polo usuario na aplicación: por exemplo o botón.
- Os engadidos polo usuario á aplicación (debuxos/imaxes): por exemplo a imaxe de Android.
- O obxectivo sería, que independentemente da resolución da pantalla se obtivera o seguinte resultado: os obxectos vense do mesmo tamaño aínda tendo resolucións distintas.
- Imos ver antes de nada unha serie de conceptos:
Tamaños de pantalla e densidade (puntos por pulgada: dpi)
- Tamaño da pantalla: tamaño da diagonal da pantalla física do dispositivo.
- Por simplicidade Android divide as pantallas, até a versión Android 3.2 en : pequenas (small), normales, grandes (large) e extra largas (extra large).
- Densidade de pantalla (Screen density): puntos por pulgada (ppp / (dot per inch (dpi))). Unha pantalla de baixa resolución terá poucos dpis comparada cunha pantalla normal ou de alta resolución.
- Por simplicidade Android agrupaba as densidades :
- ldpi: baixa (low, 120 dpi)
- mdpi: media (medium, 160 dpi)
- hdpi: alta (high, 240 dpi)
- xhdpi: extra alta (extra high, 320 dpi)
- xxhdpi: extra extra alta (extra-extra high, 480 dpi)
- xxxhdpi: extra extra extra alta (extra-extra-extra high, 640 dpi)
Orientación e resolución
- Orientación: dende o punto de vista do usuario indica se o dispositivo está en apaisado ou en vertical. Ao rotar a pantalla cambia a relación de altura e ancho.
- Resolución: indica o número total de píxeles que ten a pantalla. Cando se desenvolven aplicacións para distintas pantallas débese traballar coa densidade e co tamaño da pantalla e non coa resolución total.
Píxeles independentes da densidade (dp)
- Píxel independente da densidade (Density-independent pixel (dp)): é un píxel virtual que debe ser usado cando se definen elementos gráficos nun layout, tanto para expresar tamaño dun obxecto, como a súa posición.
- Unha pantalla media(medium) ten 160 dpi.
- Nunha pantalla media 1dp=1dpi. Isto é nunha pantalla media o píxel virtual coincide co píxel real.
- En tempo de execución é cando se fai a conversión de unidades dp a píxeles físicos (px).
- O factor de conversión é: px= dp (dpi / 160).
- Por exemplo 1 dp nunha pantalla de densidade:
- 120dpi: sería igual a 0,75 px (píxeles físicos).
- 160dpi: sería igual a 1 px (píxeles físicos).
- 240dpi: sería igual a 1,5 px (píxeles físicos).
- 320dpi: sería igual a 2 px (píxeles físicos).
- 480dpi: sería igual a 3 px (píxeles físicos).
- 640dpi: sería igual a 4 px (píxeles físicos).
- Deste xeito se defininos sempre as dimensións e posicións en dp sempre se vai realizar unha conversión en tempo de execución ao número de píxeles físicos equivalentes.
- Scale-independent Pixels (sp): esta unidade é igual a dp, pero é usada para tamaños de texto. Estes tamaños poden se axustados pola densidade da pantalla e polas preferencias do usuario.
A seguinte imaxe amosa os rangos entre que se moven os distintos tamaños de pantalla e os distintos tipos de densidade:
- AS IMAXES
- Pero aínda nos falta saber que facer coas imaxes que pode incorporar un usuario a unha aplicación.
- Pódese prover para cada imaxe un ficheiro distinto adaptado ás distintas densidades.
- Se non se provén ficheiros para as distintas densidades o sistema escalará o ficheiro proporcionado para a densidade media (mdpi) e adaptarao a densidade da pantalla. Pero sempre será mellor proporcionar distintas versións da imaxe.
- Para proporcionar distintas versións de densidade dunha imaxe debemos seguir a regra: 3(ldpi):4(mdpi):6x(hdpi):8(xhdpi). Isto é, se collemos como referencia unha imaxe densidade media (mdpi) de tamaño X*Y píxeles, debemos crear novas imaxes que garden a seguinte relación en tamaño (número de píxeles): ldpi(x0.75), mdpi(x1), hdpi(x1,5) e xhdpi(x2).
- Exemplo se temos unha imaxe de 48x48 píxeles (tamaño dunha icona de lanzamento dunha aplicación) e esta é para unha densidade mdpi, debemos crear versións cos seguintes tamaños en píxeles:
- ldpi: 36x36
- mdpi: 48x48
- hdpi: 72x72
- xhdpi: 96x96
- Visto todo o anterior agora volvamos a ver de novo as imaxes onde se usan os píxeles para os tamaños e as posicións:
- E a que usa dp e distintas versións dunha mesma imaxe:
- Observar como coinciden para os dous casos na densidade media.
- Referencias:
Ficheiros do proxecto Android
A continuación imos ver os contidos dos distintos cartafoles que compoñen un proxecto.
/src
A clase U2_01_OlaMundo herda da clase Activity os seus atributos e métodos.
Neste caso sobrescríbese o método onCreate, que é o primeiro que se executa cando se lanza unha Activity (ver imaxe superior dos estados dunha Activity). Este método recibe un parámetro de tipo Bundle, no que recibe o estado da activity:
(-Null: porque acabamos de iniciala
-ou valores do estado anterior se vén de estar parada. Mirar imaxe superior do ciclo de vida).
Chama ao método onCreate da clase pai.
A continuación mostra en pantalla o contido do layout: activity_u2_01__ola_mundo. Para iso fai uso da clase R, como veremos a continuación.
http://developer.android.com/reference/android/os/Bundle.html
http://developer.android.com/reference/android/app/Activity.html#setContentView%28int%29
/res
Cartafol res (Resources/Recursos): almacena todos os ficheiros de recursos necesarios para a aplicación: imaxes, vídeos, ficheiros xml, animacións, ficheiros para a internacionalización, etc.
/gen
O cartafol /gen contén codigo Java creado automaticamente ao compilar a aplicación. O ficheiro máis importante é R.java.
O ficheiro R.java define a clase R que serve de enlace entre os recursos creados en /res e o código Java da aplicación. Para iso, a clase R contén constantes cos IDs dos recursos de /res. Este ficheiro é xerado cada vez que se compila co cal se modifica manualmente perderanse os cambios na próxima compilación.
/assets
- Contén o resto de ficheiros que se precisen para a aplicación: ficheiros de configuración, de datos, etc. Para acceder a estes recursos non se fai a a través da clase R senón que a través da súa ruta no sistema
/bin
- Unha vez que se compila a aplicación xerase o apk da aplicación para poder ser instalada nun dispositivo.
Ficheiro AndroidManifest.xml
- Contén a definición das características máis importantes da aplicación: nome, versión, icono, activities, servizos, instrumentación, permisos de acceso aos recursos, etc.
Podemos ver os SDKs mínimo e obxectivo (Edición 2015: lembrar SDK mínimo, como mínimo o 16), a icona que se vai usar para a aplicación, (foi o que escollemos cando a creamos, está accesible a través dunha referencia a un recurso), o nome da aplicación e o tema a usar. Revisar o ficheiro strings.xml de /res/values. Finalmente está a lista de activities que ten a aplicación, neste caso unha soa, a principal.
-- Ángel D. Fernández González e Carlos Carrión Álvarez -- (2015).