Cómo y por qué utilizar los Visibility Listeners de Android
La interfaz de usuario de Android se construye a partir de Vistas, y en una aplicación normal, suele haber varias de ellas. Para saber qué View está viendo el usuario en ese momento, es necesario instalar Visibility Listeners.
Lee a continuación para conocer las diferentes opciones que tienes para identificar el estado de visibilidad de un View.
Para que nuestros listeners funcionen, primero debemos asegurarnos de que nuestro View se encuentra en la jerarquía del layout. Hay dos maneras de que esto ocurra:
- Tu View ya forma parte de tu layout ya que está definido en un archivo XML
- Has creado un View dinámicamente, y necesitas añadirlo usando el método addView
El estado de visibilidad de una Vista es de tipo Integer y puede tener una de tres opciones:
- VISIBLE (0) – La Vista es visible para el usuario
- INVISIBLE (4) – La Vista es invisible para el usuario, pero sigue ocupando espacio en el layout
- GONE (8) – La Vista es invisible, y no ocupa espacio en el layout
Una vez dentro de nuestra jerarquía de layout, hay unas cuantas opciones nativas que nos ayudan a saber cuándo ha cambiado la visibilidad de nuestra View.
onVisibilityChanged
Este método se dispara cuando la visibilidad de la vista o de un ancestro de la vista ha cambiado. El estado de la visibilidad se encuentra dentro del parámetro visibility.
onWindowVisibilityChanged
Este método se dispara cuando la ventana contenedora de nuestra View ha cambiado su visibilidad. Esto no garantiza que la ventana en la que está tu View sea visible para el usuario, ya que puede estar tapada por otra ventana.
Escuchadores de visibilidad en acción
Para ver estos dos escuchadores en acción, vamos a crear un proyecto sencillo. Tendremos un LinearLayout con un TextView y un botón. Haremos que la acción on click del botón añada nuestra vista personalizada al layout.
Nuestra vista personalizada:
Y por último, el código en nuestra MainActivity:
Cuando ejecutamos la aplicación y pulsamos el botón obtenemos:
Puedes obtener el proyecto de ejemplo aquí.
ViewTreeObserver
Este es un objeto nativo que tiene una amplia gama de listeners que son notificados de varios cambios de visibilidad en el árbol de vistas. Algunos de los más destacados son:
- OnGlobalLayoutListener
- OnWindowAttachListener
- OnWindowFocusChangeListener
Para adjuntar un ViewTreeObserver, hay que hacer lo siguiente:
La línea linearLayout.getViewTreeObserver().removeOnGlobalLayoutListener(this)
se asegura de que el listener sólo será llamado una vez. Si quiere seguir escuchando los cambios, elimínela.