Interfaces, callbacks, listeners, llámalos como quieras, pero úsalos

Los callbacks funcionan de forma similar a un listener. Cuando tenemos que comunicar dos clases cuya visibilidad es unidireccional, como por ejemplo una activity con un adapter (en las que la activity contiene una instancia del adapter pero no en el otro sentido), tenemos un problema si necesitamos que la clase contenida se comunique con la clase que la contiene.
Diagrama de clases con dos clases. La clase MainActivity puede contener uno varios adapters, pero los adapters no continen ninguna activity.

Diagrama de clases

La activity puede llamar a los métodos del adapter, pero el adapter no tiene un objeto activity (y pasárselo es altamente desaconsejable, ya que entorpece a la modularidad). ¿Qué sucede si necesitamos que, ante determinado evento en el adapter, se modifique una vista en la activity? En este caso podemos utilizar un bus de eventos o podemos crear un callback.

Paso a paso

En este tutorial tendremos un campo de texto y un botón en un fragment. Al pulsar el botón, un interfaz enviará el texto a la activity, donde se mostrará. Para ello tendremos que seguir los siguientes pasos:
  1. Crear una interfaz anidada en nuestra activity
  2. Instanciar la interfaz
  3. Crear un setter para la interfaz en el fragment
  4. Usar la interfaz ante determinado evento

1. Crear una interfaz anidada

Queremos recibir en nuestra activity un texto proveniente de un fragment, por lo que necesitamos crear una interfaz que tenga un método que reciba ese texto para poder utilizarlo. Ese método será recibirTexto(String s):

2. Instanciar la interfaz

Podemos hacer esto de dos maneras: haciendo que MainActivity implemente la interfaz o creando una instancia anónima de la interfaz en la MainActivity. Sea como sea, debemos sobrescribir el método recibirTexto(String s) indicando en él qué es lo que vamos a querer hacer con el texto recibido.

Implementando la interfaz

Instancia anónima

En cualquiera de los dos casos, estaremos obligados a sobrescribir el método recibirTexto(String s). En el cuerpo de este método debemos escribir el código de lo que queremos hacer con el texto recibido, que en este caso solo es mostrarlo.

3. Crear un setter para la interfaz en el fragment

Una vez implementada la interfaz, necesitamos pasársela al fragment para que este la pueda utilizar. Para ello creamos un setter en el fragment. Y desde la activity le asignamos la interfaz antes de añadir el fragment: Si hemos optado por implementar la interfaz, le pasaríamos this, en lugar de interfaz.

4. Utilizar la interfaz

Ahora ya tenemos la instancia de la interfaz en el fragment, por lo que no nos queda más que llamarla cuando pulsemos el botón: Y listo. Ahora, cuando se pulse el botón, se llamará al método recibirTexto(), que se ejecuta en la MainActivity y que cambia el texto que aparece en esta.

5. Cuadro resumen

Esquema del orden en el que se deben declarar los elementos de cada clase

Resumen

  1. Crea una interfaz en la clase contenedora
  2. Crea un objeto de la interfaz en la clase contenedora
  3. Crea un campo del tipo de la interfaz en la clase contenida
  4. Crea un método para recibir la interfaz en la clase contenida
  5. Asigna la interfaz a la clase contenida
  6. Utiliza la interfaz para avisar a la clase contenedora de que se ha producido un evento en la clase contenida
1 Comentario
  1. Javier 5 años

    Exelente gracias.

Contesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

*

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.

©2023 Codictados Comunidad libre para el aprendizaje de codigo Online

o

Inicia Sesión con tu Usuario y Contraseña

o    

¿Olvidó sus datos?

o

Create Account