La interfaz de usuario de Android se crea a partir de Vistas y, en una aplicación normal, generalmente hay varias de ellas. Para saber qué Vista está mirando el usuario actualmente, debe instalar Visibility Listeners .
Lea a continuación para conocer las diferentes opciones que tiene para identificar el estado de visibilidad de una vista.
Cómo hacerse visible
Para que nuestros oyentes funcionen, primero debemos asegurarnos de que nuestra Vista se encuentre en la jerarquía de diseño. Esto sucede de dos formas:
- Su vista ya es parte de su diseño, ya que está definida en un archivo XML
- Creaste una vista dinámicamente y necesitas agregarla usando el método addView
public void addView (View child, ViewGroup.LayoutParams params)
El estado de visibilidad de una vista es de tipo Integer y puede tener una de estas tres opciones:
- VISIBLE (0) : la vista es visible para el usuario
- INVISIBLE (4) : la vista es invisible para el usuario, pero aún ocupa espacio en el diseño
- IDO (8) : la vista es invisible y no ocupa espacio en el diseño
Una vez dentro de nuestra jerarquía de diseño, hay algunas opciones nativas para ayudarnos a saber cuándo ha cambiado la visibilidad de nuestra vista.
onVisibilityChanged
protected void onVisibilityChanged (View changedView, int visibility)
Este método se activa cuando la visibilidad de la vista o de un antepasado de la vista ha cambiado. El estado de la visibilidad se encuentra dentro del parámetro de visibilidad.
onWindowVisibilityChanged
protected void onWindowVisibilityChanged (int visibility)
Este método se activa cuando la ventana contenedora de nuestra Vista ha cambiado su visibilidad. Esto no garantiza que la ventana en la que se encuentra su Vista sea visible para el usuario, ya que puede estar oscurecida por otra ventana.
Oyentes de visibilidad en acción
Para ver a estos dos oyentes en acción, creemos un proyecto simple. Tendremos un LinearLayout con un TextView y un botón. Haremos que la acción del botón al hacer clic agregue nuestra vista personalizada al diseño.

Nuestra vista personalizada:
package com.tomerpacific.viewvisibility; import android.content.Context; import android.graphics.Color; import android.util.Log; import android.view.View; import android.widget.LinearLayout; import android.widget.TextView; import static android.view.Gravity.CENTER; public class MyCustomView extends LinearLayout { private final String TAG = MyCustomView.class.getSimpleName(); public MyCustomView(Context context) { super(context); this.setBackgroundColor(Color.GREEN); this.setGravity(CENTER); TextView myTextView = new TextView(context); myTextView.setText("My Custom View"); addView(myTextView); } @Override public void onVisibilityChanged(View changedView, int visibility) { super.onVisibilityChanged(changedView, visibility); Log.d(TAG, "View " + changedView + " changed visibility to " + visibility); } @Override public void onWindowVisibilityChanged(int visibility) { super.onWindowVisibilityChanged(visibility); Log.d(TAG, "Window visibility changed to " + visibility); } }
Y finalmente, el código en nuestra MainActivity:
package com.tomerpacific.viewvisibility; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.view.View; import android.widget.Button; import android.widget.LinearLayout; public class MainActivity extends AppCompatActivity { private Button addCustomViewBtn; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); addCustomViewBtn = (Button) findViewById(R.id.addCustomViewBtn); addCustomViewBtn.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { LinearLayout mainLayout = (LinearLayout) findViewById(R.id.mainLayout); MyCustomView myCustomView = new MyCustomView(getApplicationContext()); myCustomView.setLayoutParams(new LinearLayout.LayoutParams( LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.WRAP_CONTENT)); mainLayout.addView(myCustomView); } }); } }
Cuando ejecutamos la aplicación y presionamos el botón obtenemos:
//giphy.com/gifs/8JZA6Djt7DmYpEXj2h/html5
Puede obtener el proyecto de muestra aquí.
ViewTreeObserver
Este es un objeto nativo que tiene una amplia gama de oyentes que son notificados de varios cambios de visibilidad en el árbol de vista. Algunos de los más destacados a tener en cuenta son:
- OnGlobalLayoutListener
- OnWindowAttachListener
- OnWindowFocusChangeListener
Para adjuntar un ViewTreeObserver, debe hacer lo siguiente:
LinearLayout linearLayout = (LinearLayout) findViewById(R.id.YOUR_VIEW_ID); ViewTreeObserver viewTreeObserver = linearLayout.getViewTreeObserver(); viewTreeObserver.addOnGlobalLayoutListener (new ViewTreeObserver.OnGlobalLayoutListener() { @Override public void onGlobalLayout() { linearLayout.getViewTreeObserver().removeOnGlobalLayoutListener(this); //TODO Add Logic } });
La línea linearLayout.getViewTreeObserver().removeOnGlobalLayoutListener(this)
se asegura de que el oyente solo sea llamado una vez. Si desea seguir escuchando los cambios, elimínelo.
Si tiene algún comentario o sugerencia, no dude en hacérmelo saber.