Documente Academic
Documente Profesional
Documente Cultură
PROFESOR/A
Alberto Luengo
INDICE:
1. Introducción
a. Android: Sistema Operativo
b. Dispositivos con Android: Móviles, Tablets, Android TV, Android Auto
c. Ultima versión, 10 (Q)
d. 75% de Cuota de mercado
e. Lenguajes que intervienen en Android
f. Kotlin básico
g. Vistas y componentes
h. Navegación
4. Introducción a Kotlin
a. Variables y constantes
b. Inferir tipos
c. Arrays
d. Opcionales (Nullsafe)
e. Conversión de Tipos
8. Eventos y Referencias
a. Ids
b. Eventos
9. Navegación Básica
a. Intents
b. Parametros
c. Volver atrás
Inicialmente fue desarrollado por Android Inc., empresa que Google respaldó
económicamente y que adquirió en 2005. Android fue presentado en 2007 junto
con la fundación del Open Handset Alliance
a. Java
b. C (NDK)
c. Kotlin
d. XML
define un botón como un botón, se diseña con XML, se maqueta con XML.
Eso que define ese texto, o toda esa interfaz que tenemos en la
aplicación, se define con XML y se utiliza Java como motor controlador
de la interfaz.
e. Gradle(DSL)
Gradle tiene una gran flexibilidad y nos deja hacer usos otros lenguajes y
no solo de Java, también cuenta con un sistema de gestión de
dependencias muy estable. Gradle es altamente personalizable y rápido
ya que completa las tareas de forma rápida y precisa reutilizando las
salidas de las ejecuciones anteriores, sólo procesar las entradas que
presentan cambios en paralelo.
4. INTRODUCCIÓN A KOTLIN
Ver previamente el Video 4
Variables y constantes
La decisión de usar var o val depende del uso que queramos darle, pero resumiendo
podríamos decir que si es para almacenar una constante debemos usar val y lo
mismo si es un dato que queramos garantizar que no se modifique, y para el resto
nos quedamos con var.
Tipos de Variables
El tipo de la variable en Kotlin se especifica después del nombre de la variable y
precedido de «:«, vamos a ver cuáles son los tipos básicos que tenemos en Kotlin:
Tipos númericos:
Int: Para enteros de hasta 32bits. Ej. val diasSiglo: Int = 36526
Long: Para enteros de hasta 64bits. Ej. val distanciaLunaMetros: Long = 384400000L
Short: Para enteros de hasta 16bits. Ej. val diasAno: Byte = 3650
Byte: Para enteros de hasta 8bits. Ej. var edad: Byte = 30
Float: Para decimales de hasta 32bits. Ej. var peso: Float = 86.7F
Double: Para decimales de hasta 64bits. Ej. var temperatura: Double = 12.23
Char: Para almacenar caracteres de forma individual. Ej. var letraDNI: Char = 'D'
Boolean: Para almacenar los valores lógicos true y false. Ej. val esUnaVariable: Boolean = true
String: Permite almacenar cadenas de caracteres. Ej. var nombre: String = "Ivan"
Arrays: Permite almacenar listas de objetos. Ej. val misColoresFavoritos = arrayOf("naranja",
"azul", "rojo", "negro")
Inferir Tipo:
var mensaje = “Hola Mundo”
Como podemos apreciar, en la línea de código anterior indicamos que creamos una
variable mutable llamada mensaje con el texto “Hola Mundo”, pero no indicamos
explícitamente infiere que es de tipo String en base al valor establecido en la
variable.
Arrays:
Los arrays son secuencias de datos, del mismo tipo e identificados por un nombre
común. Para hacerlo más fácil de entender imaginemos que tenemos que
almacenar los 7 días de la semana, podríamos crear 7 variables Strings o
almacenarlas todas en una sola array.
La variable weekDays contiene todos los días de la semana. Ahora para acceder a
cada uno de los valores, lo haremos a través de la posición. Por ejemplo,
imaginemos un edificio, cada valor se almacena en una planta, por lo que el primer
valor estará en la posición 0, el segundo en la 1 y así con cada uno de ellos.
Recordar que se empieza en la posición 0.
println(weekDays.get(3))
las array tienen una serie de limitaciones, entre ellas que tienen que tener un
tamaño fijo y será el número de valores que le asignemos al instanciarla, eso
significa que siempre va a tener un tamaño de 7, y no podremos añadir más datos,
pero si cambiarlos a través de la función set().
ArrayList:
Cualquiera de estas funciones devolverá una interfaz tipo Kotlin MutableList. Esta
interfaz extiende las interfaces MutableCollection y List discutidas anteriormente
en esta sección. La interfaz MutableList agrega métodos para la recuperación o
sustitución de un elemento basado en su posición:
set(index: Int, element: E): sustituye a un elemento en la lista con otro elemento.
Esto devuelve el elemento previamente en la posición especificada.
add(index: Int, element: E): inserta un elemento en el índice especificado.
removeAt(index: Int): se deshace del elemento en un índice particular.
Opcionales (NullSafe):
En Kotlin los objetos por defecto no aceptan valores nulos, para que le podamos
asignar un null tendremos que indicar que ese objeto realmente puede ser null. De
esta forma vamos a poder garantizar que no se no producirá un
NullPointerException en tiempo de ejecución sin necesidad de llenar todo el código
de comprobaciones if (a != null) o if (b == null) cuando las variables no deban ser
null en ningún caso, pero también nos da una vía de escape para que podamos
tener los queridos NullPointerException.
Intentando sacar la longitud de la cadena cuando es null, pero no nos deja porque
no compila y nos dice que tenemos 2 opciones ?. si queremos hacerlo de forma
segura o !!. si no queremos que el compilador compruebe si puede ser null.
Operador Elvis:
Si solo usamos ?. siempre vamos a poder recibir un null y por lo tanto estamos
propagando a los siguientes objetos o funciones la necesidad de soportar nulos,
pero puede que no sea lo que queramos. Para evitar esto podemos usar el operador
Elvis ?: que nos permite definir un valor alternativo si se encuentra un null, por
ejemplo para la longitud podríamos usar 0.
IF EN KOTLIN
Con if en Kotlin se evalúa la condición introducida entre los paréntesis y si es
cierta (el resultado es true) entonces ejecuta el bloque de código del if y si no
se cumple se continua sin ejecutarlo.
if (condicion) {
// El código de este bloque se ejecuta si se cumple la condición
}
IF ELSE EN KOTLIN
Con el if Kotlin nos permite ejecutar un bloque de código concreto si se cumple
cierta condición pero si queremos que se ejecute otro código distinto cuando no
se cumpla esa condición podríamos utilizar otro if con la condición inversa o
bien utilizar el else para conseguir un código más sencillo.
if (condicion) {
// El código de este bloque se ejecuta si se cumple la condición
} else {
// Y esto es lo que se ejecuta si no se cumple
}
EJEMPLO:
En este ejemplo las opciones son excluyentes (un número no puede ser menor y
mayor que 0 a la vez) pero en caso de que no lo fuesen como en el siguiente
ejemplo siempre entra en el primer if para el que se cumpla la condición y
como solo se puede ejecutar una de las opciones ya no pasará por el resto, por
lo tanto en este ejemplo si el numero fuese 5 imprimiría simplemente Unidades
aunque el 5 cumple las 3 condiciones.
WHEN EN KOTLIN
Si la condición que vamos a evaluar va a tomar un número determinado de
valores que tenemos controlados a priori y para los que queremos ejecutar un
código diferente podemos utilizar when en lugar de usar múltiples if else para
hacer un código más legible.
when (condicion) {
valor1 -> {//...}
valor1 -> {//...}
valorN -> {//...}
else -> {//...}
}
when (numero) {
1,2 -> {
// Es 1 o 2
}
in 3..10 -> {
// Es un numero entre 3 y 10
}
!in 10..100 -> {
// Es un numero que no esta entre el 10 y el 100
}
getEdadUsuario() -> {
// El numero es igual que el resultado de la funcion getEdadUsuario
}
else -> {
// Cualquier otra cosa
}
}
Una clase es una unidad de un programa que agrupa funciones y datos para
realizar ciertas tareas relacionadas. En Kotlin declaramos una clase utilizando la
palabra reservada class—de manera similar a Java.
class Book
class Book {
var title: String
var isbn: Long
class Book (var title: String = "default value", var isbn: Long)
FUNCIONES:
También llamadas métodos en otros lenguajes como por ejemplo java. Una
función no es más que un conjunto de instrucciones que realizan una
determinada tarea y la podemos invocar mediante su nombre.
Las funciones se declaran usando la palabra clave fun, seguida del nombre del
método, los paréntesis donde declararemos los valores de entrada y unas llaves
que limitan la función.
fun showMyName(){
println("Me llamo Aris")
}
Las funciones con parámetros de entrada, que son iguales, pero al llamarlas
habrá que mandarle las variables que necesite.
Como el ejemplo anterior añadimos los parámetros de entrada pero esta vez, al
cerrar los paréntesis pondremos el tipo de variable que debe devolver nuestra
función. Luego la función hará todo lo que tenga que hacer y cuando tenga el
resultado, lo devolveremos con la palabra clave return.
FOR
El bucle for es el que se utiliza más habitualmente y en Kotlin es un poco
distinto a como es en Java, aquí tenemos una variable que itera sobre un rango
o sobre una lista, array, map,… y como tal en cada iteración toma el siguiente
valor.
Por ejemplo para imprimir los números del 1 al 5 podemos hacer un bucle for en
el que indiquemos el rango 1..5 y no tenemos que preocuparnos de declarar el
índice ni de actualizarlo.
for(num in 1..5) {
println("numero: $num")
}
/* Resultado:
numero: 1
numero: 2
numero: 3
numero: 4
numero: 5
*/
Así en Kotlin podemos usar bucles for con la misma estructura ya sea para
recorrer algún tipo de colección de objetos o para ejecutarlo un número
determinado de veces (un rango).
WHILE
Cuando usamos este tipo de bucles hay que tener cuidado para evitar producir
bucles infinitos no deseados, para lo que necesitamos que dentro del bucle se
actualice el valor que usemos en la condición de salida bajo alguna
circunstancia.
var dia= 1
println("Empiza la semana")
while(dia < 6) {
if (dia == 1) {
println("$dia dia trabajando")
} else {
println("$dia dias trabajando")
}
/* Resultado:
Empiza la semana
1 dia trabajando
2 dias trabajando
3 dias trabajando
4 dias trabajando
5 dias trabajando
A descansar
*/
SALIR DE UN BUCLE
Mientras que con continue seguimos dentro del bucle con break se sale
completamente aunque aún no se haya cumplido la condición para que termine.
Vamos con otro ejemplo con números, supongamos que queremos que se
impriman todos los números de un rango, pero si encontramos un múltiplo de 5
el bucle tiene que terminarse.
/* Resultado:
1234
*/
ORDENACIÓN DE ARRAYLIST
Para ordenar objetos complejos, por ejemplo nuestra Clase Marca, por el campo
nombre tendremos que hacer lo siguiente:
marcas.sortByDescending { it.nombre }
FILTRAR ARRAYLIST:
Usando el arraylist anterior con las marcas de coches si queremos filtrar por
marcas que contengan la letra M por ejemplo lo haremos del siguiente modo:
Dentro de la función filter siempre tiene que contener una condición, en este
caso si contiene una letra que hemos especificado, pero puede ser una
comparación de números, o si no está en blanco.
Activity:
Para entender como funciona una app en Android debemos comprender qué es
un Activity y cual es su ciclo de vida.
Es importante que conozcas cuales son los ciclos de vida y como funcionan, con
esto podrás tomar las precauciones necesarias cuando desarrolles tu aplicacion
Android y desarrollar una tarea especifica en cada ciclo de vida de la actividad,
logrando así un optimo y fluido funcionamiento de tu aplicación.
onCreate()
En este ciclo se lleva a cabo la creación de la primera interface con sus
elementos necesarios que la componen, esta primera vista se debe de mostrar a
los usuarios cuando ingresan a la aplicación, también en este ciclo se cargan
tareas y subprocesos integrados y que cumplen una función específica dentro de
la aplicación
OnCreate() se lleva a cabo una sola vez durante todo el ciclo de vida de una
Actividad, es un ciclo muy importante dentro de una aplicación Android. El
método onCreate() se puede declara de la siguiente manera
onStart()
Después de haberse creado la actividad principal, entra el ciclo de vida
onStart() el cual lleva acabo la ejecución de tareas asignadas en la aplicación,
para que se lleve acabo tareas onStart() el Activity debe haberse creado por
completo, este método puede escribirse de la siguiente manera
onResume()
Este estado se lleva acabo cuando un usuario vuelve o continua usando la
aplicación, por ejemplo si estas usando la aplicación de mensajería WhatsApp y
decides entrar a la aplicación Facebook para ver las novedades en tu red de
contactos, pero luego decides volver a usar WhatsApp, entonces al retomar el
uso WhatsApp se entra al ciclo de vida onResume() en donde se vuelven activar
las tareas que se estaban ejecutando en WhatsApp, para declarar este método
puedes escribir lo siguiente
onPause()
Este estado detiene momentáneamente ciertas tareas en la aplicación Android
que se le hayan indicado dentro del método onPause(), este puede ayudarte a
detener el consumo de datos, consumo de memoria y de recursos delicados,
este estado se puede dar en las siguiente situaciones:
Cuando el usuario deja la aplicación para irse a otra aplicación o realizar otra
tarea en el equipo móvil.
En Android 7 hacia delante se pueden abrir aplicaciones en múltiples ventanas,
como solo una de las aplicaciones (ventanas) se prioriza o enfoca, las demás
aplicaciones se detienen.
Cuando dentro de una actividad se abre una ventana de diálogo, la actividad
pasa a mostrarse de fondo y queda parcialmente visible, entonces se detienen
todas las tareas que se ejecutaban en ella para dar prioridad a la ventana de
diálogo.
Puedes declara este método de la siguiente manera:
onStop()
Este estado se lleva a cabo cuando la actividad o vista de tu aplicación ya no es
visible para el usuario y pasa a detener todas las tareas que se estaban
ejecutando, así mismo cuando la aplicación entra al estado onStop(), el sistema
detiene y libera todos los recursos que no son necesarios usarlos.
onDestroy()
Este estado o ciclo de vida es llamado antes de que una actividad finalice o sea
destruida, este estado se puede dar porque:
MANIFEST:
a. Contenedores
LINEARLAYOUT:
Relative Layout:
CONSTRAINTLAYOUT:
Ejemplo de un ConstraintLayout:
<TextView
android:id="@+id/titulo"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Hello World!"
android:textColor="#333333"
app:layout_constraintBottom_toTopOf="@+id/editText"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent" />
<Button
android:id="@+id/button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="10dp"
android:background="@color/colorPrimary"
android:text="Aceptar"
android:textColor="#FFFFFF"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<EditText
android:id="@+id/editText"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:ems="10"
android:hint="Name"
android:inputType="textPersonName"
app:layout_constraintBottom_toTopOf="@+id/button"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>
TEXTVIEW:
Propiedades de un TextView:
Cambiar el texto
android:text="Titulo"
Typeface (tipografía).
android:typeface="serif"
Ejemplo de TextView:
<TextView
android:id="@+id/text_id"
android:layout_width="300dp"
android:layout_height="200dp"
android:capitalize="characters"
android:text="hello_world"
android:textColor="@android:color/holo_blue_dark"
android:textColorHighlight="@android:color/primary_text_dark"
android:textSize="50dp"/>
EDITTEXT:
TEXT FIELDS
Plain Text
Person Name
Password
Password (numeric)
E-mail
Phone
Postal Address
Multiline Text
Time
Date
Numer
Number (signed)
Number (decimal)
Ejemplo de EditText:
<EditText
android:id="@+id/editText"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:ems="10"
android:hint="Name"
android:inputType="textPersonName"
app:layout_constraintBottom_toTopOf="@+id/button"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent" />
BUTTON:
Un botón es un control con texto o imagen que realiza una acción cuando el
usuario lo presiona. La clase Java que lo represente es Button y puedes
referirte a él dentro de un layout con la etiqueta <Button> respectivamente.
Ejemplo de Button:
<Button
android:id="@+id/button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerHorizontal="true"
android:layout_centerVertical="true"
android:text="AGREGAR" />
IMAGEVIEW:
Ejemplo de ImageView:
<ImageView android:id="@+id/ImgFoto"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/ic_launcher"/>
8. Eventos y Referencias
Ver previamente el Video 8
En Android, existe más de una forma de interceptar los eventos desde una
interacción del usuario con tu aplicación. Al considerar los eventos dentro de tu
interfaz de usuario, el enfoque consiste en capturar los eventos desde el objeto
de vista específico con el que interactúa el usuario. La clase de vista
proporciona los medios para hacerlo.
Ids:
Para poder acceder en nuestro Activity a los elementos visuales que hemos
creado en el layout(xml) todos tienen que tener un id referenciado de esta
manera:
android:id="@+id/button"
Ahora desde nuestro Activity podremos acceder a los datos que contiene o
modificarlos:
Aquí podemos establecer lo que hará nuestro código una vez pulsado el botón
con id BUTTON.
button.setOnClickListener {
9. NAVEGACIÓN BÁSICA
Ver previamente el Video 9