30. Android: actividades e intenciones

Conversiones "cast" o "typecast"

Es posible hacer conversiones entre tipos de datos cuyas clases tienen alguna relación de herencia. por ejemplo:


La forma de realizar conversiones consiste en colocar el tipo destino entre paréntesis, a la izquierda del valor que queremos convertir de la forma siguiente:

Tipo VariableNueva = (NuevoTipo) VariableAntigua;

Por ejemplo:
    int miNumero = (int) ObjetoInteger;  
    char c = (char)System.in.read();

Actividades

Las actividades de una aplicación son lo que conocemos vulgarmente como las "pantallas" de la aplicación.

Una aplicación suele estar compuesta de varias pantallas, es decir de varias actividades. El usuario navegará entre las distintas pantallas que tenga la aplicación cambiando así de actividad. En casi todos los dispositivos encontraremos la posibilidad de navegar hacia atras, para mostrar la pantalla anterior.


La navegación entre actividades suele hacerse a partir de pulsaciones en la pantalla, es decir, al pulsar sobre un botón, por ejemplo, aparece otra actividad.

Todas las actividades tienen una interfaz de usuario asociada. En realidad una actividad es una clase Java que deriva (es hija) de la clase "Activity". Además, lleva asociada una interfaz de usuario o interfaz gráfica (XML).

Cuando creamos un proyecto nuevo se genera una actividad por defecto que se alberga en el archivo MainActivity.java:



La ultima sentencia de todas se encarga de mostrar la interfaz de usuario de la actividad: archivo "activity_main.xml".

Esta es la actividad que se muetra cuando arrancamos la aplicación.

Cada vez que creemos una actividad tendremos que registrarla en el archivo "AndroidManifest.xml".

Crear una nueva actividad


Para crear un nueva actividad simplemente vamos a crear un nuevo archivo Java. Para ello vamos hasta la carpeta donde esta guardado el archivo "MainActivity.java", y pulsamos boton derecho, y después elegimos "New" > "Java Class", y le damos un nombre al nuevo archivo. Será consejable que lleva al final del nombre la palabra "Actitivy", por ejemplo "MiOtraActivity".

Una vez creado el archivo, podremos abrirlo y veremos esto:


Ahora tenemos que hacer 2 cosas:
  • Hacer que nuestra nueva clase herede de de la clase "AppCompactActivity.java".

  • Y añadirle el método "onCreate()" que deben de llevar todas las actividades. 
Para ello podemos abrir nuestro viejo conocido archivo "MainActivity.java" y copiar su contenido en el archivo "MiOtraActivity.java". De manera que quede así:


Como podemos suponer, en dicho código la sentencia "setContentView(R.layout.activity_main)" provocará que se muestre la interfaz de usuario de "activity_main.xml". Así que tendremos que cambiar "activity_main.xml" por otro archivo.


Ya hemos creado la nueva actividad, ahora querremos mostrarla cuando, por ejemplo se pulse un botón. Pero antes... ¡¡¡tenemos que añadir la nueva actividad recien creada en el archivo "AndroidManifest.xml"!!!. Este archivo está en la carpeta "manifests":


Una vez abierto el archivo "AndroidManifest.xml" añadimos la siguiente linea (marco rojo):


Ahora que la actividad ha quedado registrada, vamos a añadir el mecanismo para lanzarla por ejemplo cuando se pulse un botón. Para ello vamos a hacer 2 pasos:

Paso 1: añadir un botón a la interfaz de usuario de "MainActivity". A continuación veremos en la vista "Text" (XML) lo siguiente:




Como se puede ver el botón añadido tiene un atributo "android:id", cuyo valor es "@+id/button". Este valor "button" es el identificador del elemento. También podemos encontrar este mismo valor en la casilla "ID" del panel de propiedades del elemento:




Como podemos imaginar, dicho valor es modificable, pero de momento lo mantenemos aśi.

Paso 2: a continuación añadimos el siguiente código en el método onCreate() de "MainActivity":



En el código anterior la parte nueva que hemos de añadir es la que aparece a continuación de la linea en blanco.

Veamos por partes el código anterior:

1ª linea




Esta linea selecciona el botón que hemos añadido en el "Paso 1" a través de su atributo "id". Para ello hemos usado el método findViewById().

La conversión "cast" es necesaria ya que el tipo de objeto devuelto por el método "findViewById()" es de la clase "View", y de esa manera lo podremos asignar a la variable "button" que es de tipo "Button".


Lineas posteriores:




En estas lineas registramos el manejador (escuchador) del evento "onclick". . El "target" u objetivo del evento es el botón que hemos seleccionado en la linea anterior.


En la primera de las lineas, llamamos al método "setOnClickListener()" de la clase "View", y le pasamos como argumento un clase anonima que implementa la interface "View.OnClickListener".


Una clase anonima es una clase que se crea en el interior de otra clase en vez de en un archivo aparte, y que además no lleva un nombre asociado. Para crear una clase anonima tambień usamos la palabra clave "new", porque la clase se crea y se instancia al mismo tiempo. Es como crear una clase "en linea".

El concepto de las clases anonimas es muy parecido al de las funciones anonimas en JavaScript, que también se definen cuando se crea un manejador de un evento.

Será conveniente crear clases anonimas cuando el cuerpo de la clase es muy corto o solamente la vamos a usar una vez. Son clases efimeras.

En este caso la clase anonima la definimos para pasarsela como argumento al método setOnClickListener().

La clase anonima no tiene nombre, asi que NO podremos definir tampoco un constructor con su mismo nombre en su interior.


Como hemos dicho antes, esta clase anonimo, implementa la "interface" "View.OnClickListener". Es cierto "View.OnClickListener()" que se podría confundir con una llamada a una método, pero si nos fijamos, la "O" de "OnClickListener" es mayúscula. Recordemos que en Java, la letra primera de un método es minuscula.

La "interface" "View.OnClickListener" obliga a redefinir los métodos que hay en su interior a aquellas clases que quieran implementarla. Como podemos ver en la definición de la función aqui:

https://developer.android.com/reference/android/view/View.OnClickListener.html

el único método definido es "onClick()" que el mismo que define la clase anónima en su interior.

El método "onClick()" es este:



Dentro de "onClick()", esta escrito el código que creará la nueva actividad. Para ello, primeramente creamos un objeto de la clase "Intent", al que le pasamos como  "MainActivity.this" y "MiOtraActivity.class". Veamos que quiere decir cada uno:

  • MainActivity.this: esto se refiere al objeto actual MainActivity.this. Ahora alguien podría preguntar, "pero... ¿no era la palabra "this" la que representaba al objeto actual?". Respuesta: debemos de recordar que esta  sentencia no esta escrita dentro de la clase "MainActivity" sino dentro de la clase anonima, por tanto para hacer referencia al objeto "MainActivity" debemos de escribir "MainActivity.this".
  • MiOtraActivity.class: esto hace referencia a la clase de la actividad que vamos a abrir (MiOtraActivity).

Comunicación entre actividades


Podemos intercambiar datos entre actividades. Es decir, una actividad puede enviar datos a otra actividad, y la actividad que los recibe los puede recoger.
Los datos se pasan en forma de nombre-valor.

Ejemplo: al código anterior de "MainActiviy.java" vamos a añadirle las siguientes lineas previas al lanzamiento de la actividad "MiOtraActivity":

Dichas lineas sirven para para pasar 2 parametros ("usuario" y "edad") a MiOtraActivity.java.

En realidad "usuario" y "edad" son los identificadores de los datos a enviar, y "Pepito Pérez" y "27" los valores respectivos.

En la actividad lanzada ("MiOtraActivity") podemos recoger los datos "usuario" y "edad" así:


Es posible también enviar datos desde la actividad lanzada a la actividad lanzadora. Para ello, en vez de llamar al método "startActivity()" para llamar a "MiOtraActivity", llamamos al método "startActivityResult()":


Despues añadimos un botón en "MiOtraActivity", para que al pulsarlo, dicha finalice y le pase datos a "MainActivity".


Por último, en "MainActivity" añadimos el método onActivityResult(), que se ejecuta cuando hemos llamado a "startActivityForResult()", y en el que recuperamos el valor de dato "resultado" enviado desde "MiOtraActivity":












 
























Comentarios

Entradas populares de este blog

5. CSS: formatear un documento HTML

34. Java: final, static, constantes, colecciones

29. Android: tipos de layouts