Dam M08 T02 PDF
Dam M08 T02 PDF
Dam M08 T02 PDF
A
Tema 2. Programación de aplicaciones para dispositivos
móviles
¿Qué aprenderás?
• Crear proyectos en Android Studio y construir aplicaciones móviles.
• Usar recursos de tipo layout que permiten separar la capa de
presentación de la capa lógica.
• Distinguir entre los distintos tipos de almacenamiento y elegir el más
adecuado en cada situación.
• Utilizar distintas clases para establecer comunicaciones a través de
Internet con servidores de datos externos.
¿Sabías que…?
• Un layout es un contenedor pensado para controlar la distribución,
posición y tamaño de elementos gráficos que se colocan en su
interior.
• Los widgets o elementos gráficos se utilizan para crear una interfaz
gráfica que permita interactuar con el usuario, recogiendo datos y
mostrando información en la pantalla del dispositivo.
Programación multimedia y dispositivos móviles
Tema 2: Programación de aplicaciones para dispositivos móviles
Android Studio se ha convertido en el entorno de desarrollo integrado (IDE) oficial para el desarrollo
de aplicaciones para Android. Consta de un editor de código y diferentes herramientas para
desarrolladores pensadas para aumentar la productividad, un sistema de ayuda para la construcción
de interfaces gráficas de usuario (GUI), un editor de texto, un compilador y un depurador. Además,
entre sus características destacan:
2
Programación multimedia y dispositivos móviles
Tema 2: Programación de aplicaciones para dispositivos móviles
3
Programación multimedia y dispositivos móviles
Tema 2: Programación de aplicaciones para dispositivos móviles
2.2.1. Project
Un proyecto de Android Studio incluye uno o más módulos con archivos de código fuente y
archivos de recursos.
4
Programación multimedia y dispositivos móviles
Tema 2: Programación de aplicaciones para dispositivos móviles
App
Por defecto, los archivos del proyecto se muestran en la vista de proyecto de Android, facilitando
el rápido acceso a los archivos del proyecto. En la siguiente imagen se puede ver las diferentes
posibles vistas de los ficheros/carpetas del proyecto.
5
Programación multimedia y dispositivos móviles
Tema 2: Programación de aplicaciones para dispositivos móviles
Gradle
A parte de la carpeta de aplicación del proyecto, Android Studio usa Gradle como base del sistema
de compilación. El archivo de compilación de Android Studio tiene el nombre build.gradle. Es un
archivo de texto que utiliza la sintaxis Groovy para configurar la compilación del proyecto, buscar
las dependencias y hacer que estén disponibles en tu compilación.
6
Programación multimedia y dispositivos móviles
Tema 2: Programación de aplicaciones para dispositivos móviles
Dentro del Build.Gradle (Module) nos podemos encontrar, entre otros, los siguientes parámetros:
2.2.2. Ejecución
Android Studio también dispone de herramientas de ejecución y depuración que permiten revisar
el código en la vista del depurador y verificar referencias, expresiones y valores de variables.
2.2.3. Editor
El editor es la sección del IDE donde más usaremos ya que en ella modificaremos básicamente dos
tipos de ficheros:
7
Programación multimedia y dispositivos móviles
Tema 2: Programación de aplicaciones para dispositivos móviles
Manifest
Java
8
Programación multimedia y dispositivos móviles
Tema 2: Programación de aplicaciones para dispositivos móviles
Layout
Es donde vamos a diseñar el entorno gráfico de nuestra aplicación.
Posee básicamente tres modos de diseño para trabajar con él:
2.2.4. Trazas
Abajo del IDE nos podemos encontrar la sección de trazas que nos será realmente útiles para
solucionar errores.
Las 4 tipologías de trazas que nos podemos encontrar son:
• Errores de compilación
• Errores de construcción (build)
• Errores de instalación (run)
• Errores de ejecución (crash)
9
Programación multimedia y dispositivos móviles
Tema 2: Programación de aplicaciones para dispositivos móviles
Compilación
Construcción / Build
10
Programación multimedia y dispositivos móviles
Tema 2: Programación de aplicaciones para dispositivos móviles
Ejecución / crash
Trazas controladas y uso del filtro en las trazas. Además de las trazas debido a errores, también
podemos usar la sección de “logcat” para enviar mensajes del programador por consola y, de esta
forma, poder averiguar que sucede dentro del código sin necesidad de usar el debug, muy útil en
elementos como los hilos / threads.
Donde el primer parámetro (“MiTag” en este caso) es el Tag que usaremos en el filtro del “logcat”
y el segundo parámetro es el texto que queremos que aparezca por consola.
En la siguiente imagen se puede ver un ejemplo de cómo realizar la búsqueda del filtro “MiTag”:
Hay que comentar que en esta imagen no hay ningún emulador seleccionado y no aparece
ninguna traza.
11
Programación multimedia y dispositivos móviles
Tema 2: Programación de aplicaciones para dispositivos móviles
En la parte del menú existen muchas opciones con las que, poco a poco, nos iremos
familiarizando. Intentar explicarlas todas ahora no posee demasiado sentido.
12
Programación multimedia y dispositivos móviles
Tema 2: Programación de aplicaciones para dispositivos móviles
Una vez tenemos el proyecto acabado el Gradle se encarga de generar el ejecutable para ser
instalado en el emulador o en el móvil físico.
El Gradle realiza la construcción (build) y genera el APK (fichero ejecutable en el sistema Android),
una vez creado dicho ejecutable, se instala en el móvil y a esta acción se le llama deploy
(desplegar).
13
Programación multimedia y dispositivos móviles
Tema 2: Programación de aplicaciones para dispositivos móviles
Una vez tenemos el proyecto acabado, el Gradle se encarga de generar el ejecutable para ser
instalado y ejecutado en el emulador.
La primera recomendación si usamos el emulador de Android Studio es limpiar la cache cada vez
que abrimos el emulador por primera vez. Hay muchos errores provocados por este motivo. Para
ello tenemos que abrir el AVD manager y realizar un Wipe Data.
Desde los botones de acceso rápido en la parte superior del Android Studio:
14
Programación multimedia y dispositivos móviles
Tema 2: Programación de aplicaciones para dispositivos móviles
Una vez abierto el AVD manager desplegamos la flecha abajo y seleccionamos el “Wipe Data” para
limpiar el emulador. Si había APK ya instaladas desaparecerán, si había fotos, música o videos
añadidos también se borrarán.
15
Programación multimedia y dispositivos móviles
Tema 2: Programación de aplicaciones para dispositivos móviles
Y modificar las versiones del Plugin de Gradle y/o del Gradle para que sean compatibles.
A modo ejemplo en la versión del 2020 tuve que modificar la versión que tenía:
Como referencia de compatibilidad de versiones nos tenemos que ir a la siguiente página oficial de
Android.
https://developer.android.com/studio/releases/gradle-plugin?hl=es-419
En el 2021 la combinación que no me dio errores fue:
16
Programación multimedia y dispositivos móviles
Tema 2: Programación de aplicaciones para dispositivos móviles
17
Programación multimedia y dispositivos móviles
Tema 2: Programación de aplicaciones para dispositivos móviles
18
Programación multimedia y dispositivos móviles
Tema 2: Programación de aplicaciones para dispositivos móviles
19
Programación multimedia y dispositivos móviles
Tema 2: Programación de aplicaciones para dispositivos móviles
• Actividades
• Fragmentos
• Servicios
• Proveedores de contenidos
• Receptores de emisiones
• Intents
2.6.1. Actividades
Una Actividad (de la clase Activity) es cada una de las "pantallas" de una aplicación. Una definición
más técnica, podría ser cada uno de los componentes de la aplicación que proveen al usuario una
pantalla con la que puede interactuar.
Por ejemplo, una aplicación de mensajería instantánea puede tener una actividad que muestre la
lista de contactos, otra para enviar mensajes y otra para leer mensajes recibidos. Si bien estas tres
actividades trabajan juntas dentro de la aplicación de mensajería, cada una de ellas es
independiente de las otras.
20
Programación multimedia y dispositivos móviles
Tema 2: Programación de aplicaciones para dispositivos móviles
En Android, las aplicaciones pueden llamar a actividades de otras aplicaciones. Por ejemplo, la
aplicación de mensajería anterior podría abrir una actividad de la aplicación de fotografía para
enviar una foto junto con un mensaje. Del mismo modo, la aplicación de fotografía podría abrir la
actividad de una aplicación de correo electrónico para enviar la foto como adjunto de un correo.
Imagen. Actividades.
2.6.2. Fragmentos
Un fragmento es una porción de una actividad. Podremos tener varios fragmentos y modificarlos
durante la ejecución de la aplicación con el fin de combinarlos según las necesidades.
Los Fragmentos aparecieron por primera vez en la versión de Android 3.0 Honeycomb, una versión
de Android exclusiva para tabletas. Las mayores dimensiones de las pantallas en las tabletas
permiten mostrar más información que en un teléfono móvil y por tanto los Fragmentos fueron la
manera de poder combinar varias pantallas de información en una sola.
21
Programación multimedia y dispositivos móviles
Tema 2: Programación de aplicaciones para dispositivos móviles
Imagen. Fragmentos.
2.6.3. Servicios
Un Servicio es un componente que se ejecuta en el segundo plano para realizar tareas para
trabajos remotos. Los servicios se ejecutan como cualquier otra aplicación, pero no tienen
componentes de interfaz de usuario. Son útiles para realizar tareas durante un tiempo
determinado como por ejemplo puede tomar datos del receptor GPS del teléfono.
Un servicio puede haber sido iniciado por otro componente, como por ejemplo una actividad, y
continúan en ejecución independientemente del componente que haya hecho la llamada.
El ciclo de vida de un Servicio es más sencillo que el de una Actividad y se implementa como clase
derivada de la clase Service.
Imagen. Servicio.
22
Programación multimedia y dispositivos móviles
Tema 2: Programación de aplicaciones para dispositivos móviles
Un Proveedor de contenidos (Content Provider) es una interfaz destinada a compartir datos entre
las aplicaciones. Por defecto, Android ejecuta las aplicaciones de forma independiente, por lo que
los datos de la aplicación están aislados del resto de aplicaciones del sistema. Si bien se pueden
traspasar pequeñas cantidades de información entre las aplicaciones a través de los intentos
(Intents), los Proveedores de contenidos están pensados para compartir un mayor volumen de
datos entre aplicaciones.
La información que se comparte se puede insertar, actualizar, borrar y consultar. Por ejemplo, el
Proveedor de contenidos de los Contactos proporciona la información de los contactos del
teléfono a las diferentes aplicaciones. De este modo, una aplicación como WhatsApp que posea
los permisos adecuados puede consultar los Contactos para leer y escribir información. Otro
ejemplo: el Almacén de Medios se encarga de almacenar y servir diferentes tipos de datos para
compartir, como fotos y música, entre las diferentes aplicaciones.
Un Proveedor de contenidos también puede ser útil en el caso de necesitar leer y escribir datos
que son privados y no están compartidos. Por ejemplo, una aplicación de tipo editor de texto
podría usar un Proveedor de contenidos para guardar notas.
Por otro lado, la separación entre el Almacén de Datos y la interfaz de usuario proporciona mucha
flexibilidad a Android. Por ejemplo, se podría instalar una aplicación alternativa para ver los
contactos, o una aplicación podría acceder desde el escritorio a algunos de los datos de
configuración del sistema (que también están almacenados en un proveedor de contenidos) para
modificar algunas funcionalidades, como la de activar y desactivar el WiFi. Los Proveedores de
contenidos tienen interfaces sencillas con métodos para insertar, actualizar, borrar y consultar la
información, de manera parecida a los métodos de acceso a bases de datos.
23
Programación multimedia y dispositivos móviles
Tema 2: Programación de aplicaciones para dispositivos móviles
Los Receptores de emisiones (Broadcast Rreceivers) son un tipo de componente que responde a
mensajes del sistema dirigidos a todas las aplicaciones del dispositivo. Podríamos considerarlo
como una especie de sistema de suscripción de eventos en Android, es decir, el receptor
simplemente se queda en estado latente esperando a activarse cuando ocurra un evento al que
está suscrito.
El sistema Android está emitiendo mensajes constantemente. Por ejemplo, cuando se recibe una
llamada, se apaga la pantalla o bien la batería tiene un nivel de carga bajo. Todos estos eventos
son controlados y emitidos por el sistema. Por su parte, también las aplicaciones pueden emitir
mensajes, por ejemplo, cuando una aplicación anuncia que se han terminado de descargar algunos
datos y que éstos ya están disponibles para ser usados.
Los Receptores de emisiones no tienen una interfaz visual, pero cuando se lanzan ejecutan una
parte de código (como poner en marcha una actividad o servicio) y pueden crear una notificación
en la barra de estado para alertar al usuario cuando ha ocurrido un evento.
24
Programación multimedia y dispositivos móviles
Tema 2: Programación de aplicaciones para dispositivos móviles
2.6.6. Intents
La mayor parte de los componentes de las aplicaciones que acabamos de ver se comunican a
través de mensajes asíncronos llamados Intents. Estos mensajes se crean como objetos de la clase
Intent y su comportamiento depende del componente que lo utiliza.
En las Actividades y Servicios, un intent define una acción a realizar (por ejemplo, "ver" o "enviar"
algo) y puede especificar la URI de los datos sobre las que se debe actuar. Por ejemplo, un intent
puede enviar una petición de abrir una página web y especificar la dirección de la web, para que la
actividad correspondiente pueda abrir la página correctamente.
En otros casos se puede comenzar una actividad y esperar a recibir un resultado. Por ejemplo, se
podría iniciar una actividad para seleccionar una persona de la agenda de contactos del teléfono y
la actividad devolvería el resultado en un intent (éste incluiría la URI apuntando al contacto
seleccionado).
En el caso de los Receptores de emisiones, un intent simplemente define el mensaje que se está
emitiendo; por ejemplo, un mensaje para indicar que el nivel de batería del dispositivo es bajo
incluiría únicamente una cadena de texto con un mensaje.
25
Programación multimedia y dispositivos móviles
Tema 2: Programación de aplicaciones para dispositivos móviles
2.7. Layouts
Los Layouts son la parte gráfica de Android Studio. El formato que poseen es XML. Se encuentran
en la sección de recursos del proyecto.
Podemos crear nuevos layouts situándonos sobre el item “layout” y apretar botón derecho, luego
new / “Layout Resource File”.
26
Programación multimedia y dispositivos móviles
Tema 2: Programación de aplicaciones para dispositivos móviles
Tal y como se muestra en la siguiente pantalla, el nombre del layout no puede tener mayúsculas:
Tal y como el mensaje enmarcado pone, sólo permite minúsculas de la “a” a la “z” y valores
numéricos o guion bajo “_”.
27
Programación multimedia y dispositivos móviles
Tema 2: Programación de aplicaciones para dispositivos móviles
28
Programación multimedia y dispositivos móviles
Tema 2: Programación de aplicaciones para dispositivos móviles
Otra sección para analizar en la creación de un Layout es el “Root element”. Por defecto, nos viene
informado con un layout de tipo Constraint “androidx.constraintlayout.widget.ConstraintLayout“
(el cual se explicará con más detalle más abajo), pero se puede modificar y el asistente nos ayuda
a localizar los posibles tipos de layout que existen. En la siguiente imagen se puede apreciar como
el asistente nos ayuda a rellenar el valor de este campo.
29
Programación multimedia y dispositivos móviles
Tema 2: Programación de aplicaciones para dispositivos móviles
Si le ponemos el modo visualización “Split” vemos tanto el formato de texto (XML) como gráfico:
30
Programación multimedia y dispositivos móviles
Tema 2: Programación de aplicaciones para dispositivos móviles
Si añadimos una sola constraint con respecto a uno de los lados y a arriba, entonces podemos
controlar la posición.
Con el layout_constraint… define las restricciones
Con el layout_margin… defino las distancias en relación a …
El problema de realizarlo de esta forma es que depende del tamaño de la pantalla del móvil se
verá diferente. Para logar que no dependa de la pantalla tendremos que poner restricciones en
ambos lados e indicar el % de la posición.
31
Programación multimedia y dispositivos móviles
Tema 2: Programación de aplicaciones para dispositivos móviles
32
Programación multimedia y dispositivos móviles
Tema 2: Programación de aplicaciones para dispositivos móviles
33
Programación multimedia y dispositivos móviles
Tema 2: Programación de aplicaciones para dispositivos móviles
Ahora podemos añadir guías para tomarlas como los objetos como referencias:
34
Programación multimedia y dispositivos móviles
Tema 2: Programación de aplicaciones para dispositivos móviles
Chain Mode. Cuando tenemos varios elementos que estén encadenados entre sí usamos el modo
“chain”, el cual posee varias opciones que se muestran a continuación:
35
Programación multimedia y dispositivos móviles
Tema 2: Programación de aplicaciones para dispositivos móviles
Layout_width = “0dp”
36
Programación multimedia y dispositivos móviles
Tema 2: Programación de aplicaciones para dispositivos móviles
37
Programación multimedia y dispositivos móviles
Tema 2: Programación de aplicaciones para dispositivos móviles
2.7.2. Linear
Al crear un nuevo layout me aparece el siguiente error ya que el nombre del layout no puede
empezar en mayúsculas.
Modifico también la llamada en el java para que use ese layout al probarlo:
38
Programación multimedia y dispositivos móviles
Tema 2: Programación de aplicaciones para dispositivos móviles
Por defecto el linear es horizontal, por eso aparece error algunas veces:
Horizontal
Vertical
39
Programación multimedia y dispositivos móviles
Tema 2: Programación de aplicaciones para dispositivos móviles
2.7.3. Frame
Tener dos botones uno encima de otro con dos funcionalidades diferentes y que necesite que se
muestre uno u otro según el momento:
2.7.4. Table
Depende siempre de otro layout y no puede ser el layout base. Es una forma de poder representar
los elementos en formato de tabla.
40
Programación multimedia y dispositivos móviles
Tema 2: Programación de aplicaciones para dispositivos móviles
41
Programación multimedia y dispositivos móviles
Tema 2: Programación de aplicaciones para dispositivos móviles
42
Programación multimedia y dispositivos móviles
Tema 2: Programación de aplicaciones para dispositivos móviles
Arrastrando objetos de tipo layout hacia el ComponentTree se puede generar la estructura que se
desee:
43
Programación multimedia y dispositivos móviles
Tema 2: Programación de aplicaciones para dispositivos móviles
<Button
android:id="@+id/button19"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="Button" />
<Button
android:id="@+id/button20"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="Button" />
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<Button
android:id="@+id/button15"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Button" />
<Button
android:id="@+id/button16"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Button" />
<Button
android:id="@+id/button17"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Button" />
</LinearLayout>
</LinearLayout>
45
Programación multimedia y dispositivos móviles
Tema 2: Programación de aplicaciones para dispositivos móviles
El coordinator layout nos permite realizar animaciones básicas con una gran variedad de efectos y
opciones configurables. En el ejemplo que se muestra a continuación se aprecia cómo la plantilla
“Scrolling Activity” usa este tipos de layouts.
46
Programación multimedia y dispositivos móviles
Tema 2: Programación de aplicaciones para dispositivos móviles
47
Programación multimedia y dispositivos móviles
Tema 2: Programación de aplicaciones para dispositivos móviles
48
Programación multimedia y dispositivos móviles
Tema 2: Programación de aplicaciones para dispositivos móviles
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Hello World!"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>
49
Programación multimedia y dispositivos móviles
Tema 2: Programación de aplicaciones para dispositivos móviles
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="#f00">
<TextView
android:id="@+id/tvSaludo"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Hello World!"
android:layout_centerHorizontal="true"/>
<Button
android:id="@+id/button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
50
Programación multimedia y dispositivos móviles
Tema 2: Programación de aplicaciones para dispositivos móviles
android:text="Button"
android:layout_alignRight="@id/tvSaludo"
android:layout_below="@id/tvSaludo"/>
</RelativeLayout>
</androidx.constraintlayout.widget.ConstraintLayout>
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="#f00">
<TextView
android:id="@+id/tvSaludo"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
51
Programación multimedia y dispositivos móviles
Tema 2: Programación de aplicaciones para dispositivos móviles
android:text="Hello World!"
android:layout_centerHorizontal="true"/>
<Button
android:id="@+id/button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Button"
android:layout_alignRight="@id/tvSaludo"
android:layout_below="@id/tvSaludo"/>
<LinearLayout
android:id="@+id/llMain"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="#0f0"
android:layout_below="@id/button"
android:orientation="horizontal">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Hello World!"/>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Button"/>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Button"/>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Button"/>
</LinearLayout>
</RelativeLayout>
</androidx.constraintlayout.widget.ConstraintLayout>
52
Programación multimedia y dispositivos móviles
Tema 2: Programación de aplicaciones para dispositivos móviles
53
Programación multimedia y dispositivos móviles
Tema 2: Programación de aplicaciones para dispositivos móviles
En la sección verde, modifico el segundo botón para ponerlo al centro y añado un “Framelayout”.
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="#f00">
<TextView
android:id="@+id/tvSaludo"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Hello World!"
android:layout_centerHorizontal="true"/>
<Button
android:id="@+id/button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Button"
android:layout_alignRight="@id/tvSaludo"
android:layout_below="@id/tvSaludo"/>
<LinearLayout
android:id="@+id/llMain"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="#0f0"
android:layout_below="@id/button"
android:orientation="vertical">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Hello World!"/>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Button"/>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Button"
54
Programación multimedia y dispositivos móviles
Tema 2: Programación de aplicaciones para dispositivos móviles
android:layout_gravity="center"/>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Button"/>
</LinearLayout>
<FrameLayout
android:id="@+id/flMain"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="#00f"
android:layout_below="@id/llMain">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Hello World!"
android:textColor="#fff"
android:layout_gravity="bottom|right"/>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Button"
android:layout_gravity="center_horizontal"/>
</FrameLayout>
</RelativeLayout>
</androidx.constraintlayout.widget.ConstraintLayout>
55
Programación multimedia y dispositivos móviles
Tema 2: Programación de aplicaciones para dispositivos móviles
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
tools:ignore="MissingConstraints"
android:background="#f00">
<TextView
android:id="@+id/tvSaludo"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Hello World!"
android:layout_centerHorizontal="true"/>
<Button
android:id="@+id/button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Button"
android:layout_alignRight="@id/tvSaludo"
android:layout_below="@id/tvSaludo"/>
<LinearLayout
android:id="@+id/llMain"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="#0f0"
android:layout_below="@id/button"
android:orientation="vertical">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Hello World!"/>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Button"/>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
56
Programación multimedia y dispositivos móviles
Tema 2: Programación de aplicaciones para dispositivos móviles
android:text="Button"
android:layout_gravity="center"/>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Button"/>
</LinearLayout>
<FrameLayout
android:id="@+id/flMain"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="#00f"
android:layout_below="@id/llMain">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Hello World!"
android:textColor="#fff"
android:layout_gravity="bottom|right"/>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Button"
android:layout_gravity="center_horizontal"/>
</FrameLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:background="#fff"
android:gravity="center"
android:layout_below="@id/flMain">
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Texto de prueba"
android:textColor="@android:color/holo_blue_light"
android:textAllCaps="true"
android:gravity="center_horizontal"
android:textAppearance="?android:attr/textAppearanceLarge"/>
<EditText
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="introduce tu nombre"/>
<Button
android:layout_width="wrap_content"
57
Programación multimedia y dispositivos móviles
Tema 2: Programación de aplicaciones para dispositivos móviles
android:layout_height="wrap_content"
android:text="Guardar"
android:textAllCaps="false"/>
<ImageButton
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@mipmap/ic_launcher"
android:background="?attr/selectableItemBackgroundBorderless"/>
<Switch
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Estado:"
tools:ignore="UseSwitchCompatOrMaterialXml" />
<CheckBox
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Acepta Terminos y Condiciones"/>
<ImageView
android:layout_width="200dp"
android:layout_height="200dp"
android:src="@mipmap/ic_launcher"/>
</LinearLayout>
</RelativeLayout>
</androidx.constraintlayout.widget.ConstraintLayout>
58
Programación multimedia y dispositivos móviles
Tema 2: Programación de aplicaciones para dispositivos móviles
59
Programación multimedia y dispositivos móviles
Tema 2: Programación de aplicaciones para dispositivos móviles
En Android, si bien es posible mantener este enfoque a la hora de trabajar con interfaces gráficas,
se recomienda definir totalmente la interfaz de una Actividad a partir de lo que se conoce como
Layout. Un Layout es un archivo XML que utiliza una estructura predefinida para definir cómo se
verá la aplicación en pantalla.
Desde el código fuente en Java podemos decirle a una Actividad que utilice un Layout concreto, y
de forma automática se visualizarán los elementos gráficos necesarios respetando la disposición
definida en el Layout. De este modo, la Actividad sólo debe responsabilizarse de gestionar los
eventos (es decir, la interacción con el usuario) y no la creación de la interfaz.
Un ejemplo del código fuente Java que asigna un Layout a una Actividad sería el siguiente:
60
Programación multimedia y dispositivos móviles
Tema 2: Programación de aplicaciones para dispositivos móviles
Usar recursos de tipo Layout permite separar la capa de presentación de la capa lógica,
proporcionando flexibilidad para cambiar la interfaz gráfica sin necesidad líneas de código. En el
ejemplo anterior, el mismo código podría cargar cualquier Layout que hayamos previamente creado
en el lugar de miActivityLayout y la aplicación ofrecería una interfaz de usuario diferente.
2.8.2. Widgets
La interfaz de usuario de una aplicación Android se construye utilizando objetos del tipo ViewGroup
y View. Por un lado, la clase android.view.ViewGroup sirve de clase base para las subclases de tipo
layout, que proporcionan los diferentes tipos de disposiciones de los elementos. Por otro lado, los
objetos de tipo vista son la unidad básica de una interfaz de usuario ya que heredan de la clase
android.view.View que sirve de clase base para todas las subclases llamadas widgets, que como ya
hemos visto son objetos de interfaz de usuario totalmente implementados, como por ejemplo
campos de texto y botones.
61
Programación multimedia y dispositivos móviles
Tema 2: Programación de aplicaciones para dispositivos móviles
La siguiente tabla muestra algunos de los widgets de uso más habitual en las aplicaciones Android.
Todos estos widgets están disponibles para arrastrar y soltar desde la Paleta del editor gráfico de
layouts.
Componente Descripción
El Data Binding o enlace de datos es un mecanismo que permite enlazar los elementos de la interfaz
de usuario con el código de una aplicación. Podemos decir que es el enlace entre el frontend y el
backend de una aplicación, independientemente del lenguaje de programación que se esté usando.
En Android, el método findViewById() se utiliza para buscar un componente gráfico (objetos que
heredan de la clase View) por su identificador dentro del layout. Como ya se ha dicho, todos los
controles se encuentran en el fichero R.java generado automáticamente por el compilador.
62
Programación multimedia y dispositivos móviles
Tema 2: Programación de aplicaciones para dispositivos móviles
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//2. Data binding: enlace de datos
tvMensaje = findViewById(R.id.textView);
//3. Uso del componente gráfico
tvMensaje.setText("Hola");
}
}
Los campos de texto editables se utilizan principalmente para recoger una entrada de datos por
parte del usuario. Existen diversos tipos de campo de texto, en función del tipo de datos que se
espera que entre el usuario. Los tipos de entrada de datos más habituales están especificados en la
Paleta del modo Diseño de Android Studio: texto plano, contraseña, correo electrónico, teléfono,
dirección postal, campo con varias líneas de texto, hora y fecha.
63
Programación multimedia y dispositivos móviles
Tema 2: Programación de aplicaciones para dispositivos móviles
También puede utilizarse un tipo genérico para recoger un dato de tipo String, que posteriormente
puede ser analizado y convertido a un tipo de datos diferente.
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//2. Data binding: enlace de datos
etNombre = findViewById(R.id.etCampoNombre);
//3. Uso del valor recogido en el componente gráfico
String nombre = etNombre.getText().toString();
}
}
64
Programación multimedia y dispositivos móviles
Tema 2: Programación de aplicaciones para dispositivos móviles
Android Studio permite asociar de manera sencilla un método Java al evento onClick(): simplemente
hay que seleccionar el nombre del método en el desplegable del atributo onClick. El método
seleccionado debe declararse como public y tener como parámetro un objeto de la clase View.
Otra forma de capturar la pulsación de un botón consiste en asociar al botón una interfaz del tipo
OnClickListener. A través del método setOnClickListener() asociamos la interfaz OnClickListener que
debe implementar el método onClick() tal y como se muestra a continuación.
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//2. Data binding: enlace de datos
miBoton = findViewById(R.id.button);
//3. Añadir onClickListener al botón
miBoton.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
// llamada a un método
respoderPulsacion();
}
});
}
public void respoderPulsacion() {
Toast.makeText(MainActivity.this,
"Botón pulsado", Toast.LENGTH_LONG).show();
}
}
65
Programación multimedia y dispositivos móviles
Tema 2: Programación de aplicaciones para dispositivos móviles
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//2. Data binding: enlace de datos
listaValores = findViewById(R.id.spinner);
//3. Adaptador (datos) del Spinner
String[] ciudades = {"París","Londres","Berlín"};
ArrayAdapter<String> adaptador = new ArrayAdapter<String>
(this,android.R.layout.simple_spinner_item, ciudades);
listaValores.setAdapter(adaptador);
}
}
En este ejemplo, se utiliza un array de objetos del tipo String llamado ciudades con los valores que
mostrará el control de selección. El adaptador carga los valores del array anterior. El método
setAdapter() asigna el adaptador al control de selección.
66
Programación multimedia y dispositivos móviles
Tema 2: Programación de aplicaciones para dispositivos móviles
Para evitar usar tamaños de diseño fijos (hard coded) se usan las propiedades wrap_content y
match_parent.
Estas dos propiedades son muy usadas en los elementos, tanto en los layouts como en los widgets:
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/lorem_ipsum" />
67
Programación multimedia y dispositivos móviles
Tema 2: Programación de aplicaciones para dispositivos móviles
Además del código de la aplicación y los layouts que conforman la interfaz de usuario, un proyecto
Android también puede constar de una serie de recursos como imágenes, iconos y archivos
multimedia (principalmente archivos de audio y vídeo). Estos recursos adicionales facilitan la
actualización de numerosas características de la aplicación sin cambiar el código y permiten
optimizar una aplicación para diferentes idiomas y tamaños de pantalla.
Cada recurso de un proyecto de Android tiene asignado un ID con número entero único que se
puede usar para hacer referencia al recurso desde el código Java de la aplicación. Por ejemplo, si la
aplicación contiene un archivo de imagen denominado icono.jpg en el directorio del proyecto
res/drawable/, este recurso puede ser referenciado en el código como R.drawable.icono.
Entre los recursos más habituales se encuentran las cadenas de texto utilizadas en la interfaz de
usuario. De esta forma, estas cadenas de texto se pueden traducir a otros idiomas y guardarlas en
archivos independientes. En tiempo de ejecución, Android utilizará las cadenas de idioma
apropiadas según la configuración de idioma del usuario, en función de un calificador de idioma
anexado al nombre del directorio de recursos; por ejemplo, el directorio res/values-es/ hace
referencia a los valores de las cadenas de texto español.
Los componentes gráficos de la aplicación se guardan en el fichero R.java junto al resto de recursos
del proyecto; mediante un identificador único, se accederá a esos componentes gráficos para
recoger entradas de datos o bien mostrar información al usuario.
68
Programación multimedia y dispositivos móviles
Tema 2: Programación de aplicaciones para dispositivos móviles
El siguiente video explica (divido en dos partes) el proceso de creación de una aplicación en
Android Studio.
La partes que se explican en los videos son:
• Parte1:
• Java que llama al Layout.
• Creación de un Plain Text (campo editable) y ver analizar sus propiedades.
• Usar el editor gráfico del Layout y el fichero XML.
• Explicación del String.xml.
• Parte2:
• Añadir botón y explicar propiedades.
• Incluir TextView y comentar propiedades.
• Usar dichos Widges dentro del Java.
• Definir el listener en el botón.
• Modificar el TextView según el valor del Plain Text al apretar el botón.
69
Programación multimedia y dispositivos móviles
Tema 2: Programación de aplicaciones para dispositivos móviles
Si nos encontramos con un nuevo programa y nos interesa saber por dónde empieza tendremos
que analizar el fichero AndroidManifest.xml. Veámoslo con un ejemplo:
70
Programación multimedia y dispositivos móviles
Tema 2: Programación de aplicaciones para dispositivos móviles
2.9. Trucos
Localizar elementos dependientes entre diferentes ficheros:
71
Programación multimedia y dispositivos móviles
Tema 2: Programación de aplicaciones para dispositivos móviles
Recursos y enlaces
• Guías para desarrolladores de Android
72
Programación multimedia y dispositivos móviles
Tema 2: Programación de aplicaciones para dispositivos móviles
Conceptos clave
• Actividad: una Actividad representa una pantalla individual con una
interfaz de usuario.
• Archivo de manifiesto: una aplicación debe declarar todos sus
componentes en este archivo, que debe encontrarse en la raíz de
directorios del proyecto de la aplicación.
• Componentes: los componentes de una aplicación son puntos de entrada
por los que el sistema o un usuario entran en una aplicación. Las
Actividades son el tipo de componente más habitual.
• Layout: elemento no visual destinado a controlar la distribución, posición y
dimensiones de los controles que se insertan en su interior.
• Proyecto: jerarquía donde se ubican todos los archivos de código fuente
Java, los recursos, los ficheros de configuración y los ficheros de
construcción Gradle.
• Servicio: componente que permite mantener la ejecución de la aplicación
en segundo plano.
73
Programación multimedia y dispositivos móviles
Tema 2: Programación de aplicaciones para dispositivos móviles
Test autoevaluativo
3. ¿En qué carpeta del proyecto se guardan los recursos adicionales como imágenes y vídeos?
a) media
b) misc
c) res
d) Ninguna de las respuestas anteriores es correcta
74
Programación multimedia y dispositivos móviles
Tema 2: Programación de aplicaciones para dispositivos móviles
Ponlo en práctica
Crea un nuevo proyecto en Android Studio que muestre el mensaje “¡Hola caracola!” en la pantalla
del dispositivo tal y como se muestra en la imagen siguiente.
75
Programación multimedia y dispositivos móviles
Tema 2: Programación de aplicaciones para dispositivos móviles
Solucionarios
Test autoevaluativo
3. ¿En qué carpeta del proyecto se guardan los recursos adicionales como imágenes y vídeos?
a) media
b) misc
c) res
d) Ninguna de las respuestas anteriores es correcta
4. ¿Qué herramienta utiliza Android Studio para buscar dependencias y facilitar la construcción
del proyecto?
a) CMake
b) SCons
c) Rake
d) Gradle
76
Programación multimedia y dispositivos móviles
Tema 2: Programación de aplicaciones para dispositivos móviles
Ponlo en práctica
Crea un nuevo proyecto en Android Studio que muestre el mensaje “¡Hola caracola!” en la pantalla
del dispositivo tal y como se muestra en la imagen siguiente.
Solución:
Una vez descargado e instalado Android Studio (consulta la documentación del Tema 1
para realizar estos pasos), inicia un nuevo proyecto en blanco. El nuevo proyecto requiere
un nombre y una versión de la API de Android; puedes utilizar la información de la imagen.
Una vez se ha creado el proyecto, utiliza el Editor de Diseños para modificar el valor del
atributo text del widget TextView del layout; los atributos se encuentran en la parte
derecha del editor.
77
Programación multimedia y dispositivos móviles
Tema 2: Programación de aplicaciones para dispositivos móviles
78