2010-09-24 17 views
140

puse a visibility invisibles como esto en Android:¿Cómo puedo verificar si una vista es visible o no en Android?

myImageView.setVisibility(View.INVISIBLE); 

Y entonces para que sea visible:

myImageView.setVisibility(View.VISIBLE); 

Ahora no sé si myImageView es visible o no, ¿cómo puedo comprobar es así:

if (myImageView IS VISIBLE) { 
    Do something 
} else { 
    Do something else 
} 

¿Cómo puedo hacer eso? ¿Qué debo escribir entre corchetes?

Respuesta

375

Aunque View.getVisibility() obtiene la visibilidad, no es un simple verdadero/falso. Una vista puede tener su visibilidad configurada en una de tres cosas.

View.VISIBLE La vista es visible.

View.INVISIBLE La vista es invisible, pero aún puede utilizar cualquier separación que normalmente tomar hasta. Su "invisible"

View.GONE La vista se ha ido, no se puede ver, y no hace falta ser el "punto".

Así que para responder a su pregunta, que está buscando:

if (myImageView.getVisibility() == View.VISIBLE) { 
    // Its visible 
} else { 
    // Either gone or invisible 
} 
+3

Puede ser visible mientras no esté dentro de los límites de la pantalla visible, por lo que no será preciso en todos los casos. Sin embargo, la respuesta de [Bill Mote] (http://stackoverflow.com/a/12428208/62921) funciona todo el tiempo. – ForceMagic

+1

ForceMagic es correcto y la razón por la que publiqué mi respuesta. Una vista se puede establecer en View.VISIBLE y su if-logic devolverá true; sin embargo, es posible que la vista no esté realmente visible para el usuario. Mi solución, a continuación, devolverá verdadero si, y solo si, el usuario puede ver cualquier parte de la Vista en el puerto de visualización de la pantalla. –

+0

@BillMote Mi solución fue resolver la pregunta original. Cómo obtener el valor del atributo de visibilidad. – William

3

Utilizaría el método correspondiente getVisibility(). Los nombres de método prefijados con 'get' y 'set' son la convención de Java para representar propiedades. Algunos lenguajes tienen construcciones de lenguaje reales para las propiedades, pero Java no es uno de ellos. Entonces, cuando veas algo etiquetado como 'setX', puedes estar 99% seguro de que hay un 'getX' correspondiente que te dirá el valor.

98

O simplemente podría utilizar

View.isShown() 
+2

Esto es más preciso ya que comprueba si la vista está en la lista desplegable, ya que una vista podría ser "visible" pero no tener un elemento principal. – user123321

+2

Puede ser cierto mientras no se encuentre dentro de los límites de la pantalla visible, por lo que no será preciso en todos los casos. Sin embargo, la respuesta de [Bill Mote] (http://stackoverflow.com/a/12428208/62921) funciona todo el tiempo. – ForceMagic

+0

Ver # isShown() recorre toda la visibilidad de la vista principal para verificar que se muestra en la pantalla. Este procedimiento puede ser costoso a veces. –

47

Si la imagen es parte de la disposición que podría ser "View.VISIBLE "pero eso no significa que esté dentro de los límites de la pantalla visible". Si eso es lo que buscas; esto funcionará:

Rect scrollBounds = new Rect(); 
scrollView.getHitRect(scrollBounds); 
if (imageView.getLocalVisibleRect(scrollBounds)) { 
    // imageView is within the visible window 
} else { 
    // imageView is not within the visible window 
} 
+0

¿Te importaría explicar por qué funciona esto? Miré el código fuente de View.getLocalVisibleRect y no estoy seguro de cómo funciona. – yarian

+0

Hay 2 cosas pasando aquí. 1) View.getHitRect (scrollBounds) obtiene el rectángulo de hit en las coordenadas de sus padres y los rellena en scrollBounds y 2) Sembramos View.getLocalVisibleRect (scrollBounds) de ImageView con scrollBounds. Si ImageView cae dentro de los límites de scrollBounds, el método devuelve verdadero. –

+1

Nota: Tiene problemas para formatear los comentarios a continuación. Disculpas Bien, es malo por no especificar. El punto exacto de confusión es la llamada 'imageView.getLocalVisibleRect (scrollBounds)'. De grepcode: 'getLocalVisibleRect public final boolean (Rect r) { Punto de desplazamiento = new Point(); if (getGlobalVisibleRect (r, offset)) { r.offset (-offset.x, -offset.y); // make r local return true; } return false; } ' – yarian

Cuestiones relacionadas