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:

  1. Tu View ya forma parte de tu layout ya que está definido en un archivo XML
  2. Has creado un View dinámicamente, y necesitas añadirlo usando el método addView
child es el View que quieres añadir y LayoutParams son los parámetros del layout(I.E. anchura y altura)

El estado de visibilidad de una Vista es de tipo Integer y puede tener una de tres opciones:

  1. VISIBLE (0) – La Vista es visible para el usuario
  2. INVISIBLE (4) – La Vista es invisible para el usuario, pero sigue ocupando espacio en el layout
  3. 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:

Asociamos un Listener OnClick al botón

Cuando ejecutamos la aplicación y pulsamos el botón obtenemos:

Puedes ver dentro de Logcat que los listeners son llamados cuando nuestra vista entra en escena

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:

removeOnGlobalLayoutListener requires API > 15

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.