Manejar un cambio de visibilidad de la vista sin anular la vista
¿Hay una manera de manejar un cambio de visibilidad de la vista (por ejemplo, de GONE a VISIBLE) sin anular la vista?
Algo como View.setOnVisibilityChangeListener();
?
Puede utilizar un GlobalLayoutListener
para determinar si hay cambios en la visibilidad de las vistas.
myView.setTag(myView.getVisibility()); myView.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() { @Override public void onGlobalLayout() { int newVis = myView.getVisibility(); if((int)myView.getTag() != newVis) { myView.setTag(myView.getVisibility()); //visibility has changed } } });
En lugar de subclases puede utilizar la decoración:
class WatchedView { static class Listener { void onVisibilityChanged(int visibility); } private View v; private Listener listener; WatchedView(View v) { this.v = v; } void setListener(Listener l) { this.listener = l; } public setVisibility(int visibility) { v.setVisibility(visibility); if(listener != null) { listener.onVisibilityChanged(visibility); } } }
Entonces
WatchedView v = new WatchedView(findViewById(R.id.myview)); v.setListener(this);
Eche un vistazo a ViewTreeObserver.OnGlobalLayoutListener
. Como se escribe en la documentación, su método de devolución de llamada onGlobalLayout()
se invoca cuando cambia el estado del diseño global o la visibilidad de las vistas dentro del árbol de vista. Así que puede intentar utilizarlo para detectar cuándo cambia la visibilidad de la vista.