validar studio setimageresource metodos imagen from ejemplo cambiar android android-imageview android-view android-resources

android - studio - Controlar la visibilidad de la vista desde un recurso



setimageresource (3)

Esta es una pregunta antigua que ya ha sido aceptada, pero la siguiente solución puede ayudar a otra persona:

Si marca res / values ​​/ attrs.xml en el código fuente de Android, verá la definición de propiedad de visibilidad como esta:

<!-- Controls the initial visibility of the view. --> <attr name="visibility"> <!-- Visible on screen; the default value. --> <enum name="visible" value="0" /> <!-- Not displayed, but taken into account during layout (space is left for it). --> <enum name="invisible" value="1" /> <!-- Completely hidden, as if the view had not been added. --> <enum name="gone" value="2" /> </attr>

Este atributo espera un valor de cadena (visible, invisible, desaparecido) que se convertirá a (0, 1, 2) respectivamente. Por lo tanto, puede declarar recursos enteros que contengan estos valores de esta manera:

valores / enteros.xml

<integer name="visible_in_portrait">2</integer> <!-- This is GONE -->

values-land / integers.xml

<integer name="visible_in_landscape">0</integer> <!-- This is VISIBLE -->

Sin embargo, si desea hacerlo aún mejor para dejar de adivinar estas constantes numéricas cada vez, podría hacer esto:

valores / enteros.xml

<!-- These are alias for the constants we''ll reference below --> <integer name="view_visible">0</integer> <!-- This is VISIBLE --> <integer name="view_invisible">1</integer> <!-- This is INVISIBLE --> <integer name="view_gone">2</integer> <!-- This is GONE --> <integer name="visible_in_portrait">@integer/view_gone</integer> <!-- We''re referencing the visibility alias we declared above -->

values-land / integers.xml

<integer name="visible_in_landscape">@integer/view_visible</integer>

Puede usar este enfoque o el sugerido por Keyhan. Elige el que más te convenga.

Tengo un diseño que contiene dos ImageViews. Quiero que uno de ellos sea visible en el retrato y el otro en el paisaje. ¿Cómo lo logro usando recursos? (Sé cómo configurarlo programáticamente pero este uso específico lo necesito para lograrlo usando recursos).

Intenté algo así como

en res / layout / may_layout.xml:

... <ImageView android:id="@+id/image1" android:visibility="@integer/visible_in_portrait" <<-- is this allowed? ... /> <ImageView android:id="@+id/image2" android:visibility="@integer/visible_in_landscape" ... />

en res / values ​​/ integers.xml:

... <!-- NOTE: 0 and 8 are VISIBLE and GONE respectively --> <integer name="visibile_in_portrait">0</integer> <integer name="visibile_in_landscape">8</integer>

en res / values-land / integers.xml:

... <integer name="visibile_in_portrait">8</integer> <integer name="visibile_in_landscape">0</integer>

Pero obtengo un error de tiempo de ejecución (índice fuera de límite) al intentar inflar las imágenes. Cuando elimino las declaraciones de visibilidad de android, el programa se ejecuta pero veo ambas imágenes.

P: ¿Cuál es la forma de usar un recurso como un valor para el atributo de visibilidad de Android?

(si se pregunta por qué configurarlo programáticamente no me ayudará, tiene que ver con el cambio automático de espacio / retrato de los widgets de la aplicación con los mapas de bits de archivos uri).


No es posible. (Intenté definir fill_parent como cadena y lo uso para layout_width y también falla).

¿Por qué no usas 2 diseños?

  1. res / layout / may_layout.xml
  2. res / layout-land / may_layout.xml

Cada uno de ellos define la vista de imagen correcta para mostrar.

Además, tener la tierra de los valores puede causarle problemas cuando necesita admitir varios idiomas. (Necesitará tener value-xx-land para cada idioma)


será posible cuando use este truco, agregue su línea de visibilidad a un estilo y ponga dos instancias de ese archivo en el modo normal y en el terreno.

Me refiero a que en el archivo styles.xml en los values carpeta values coloque un estilo con el nombre s1 , y coloque android:visibility=visible en eso, y en styles.xml en la carpeta styles.xml values-land coloque un estilo con el nombre s1 , y coloque android:visibility=gone .

también, en el archivo styles.xml en los values carpeta values coloque un estilo con el nombre s2 , y coloque android:visibility=gone en eso, y en styles.xml en la carpeta values-land coloque un estilo con el nombre s2 , y coloque android:visibility=visible .

y luego, configure s1 en la primera vista de la imagen y s2 en la segunda.

La solución dada por el querido Calvin también es correcta, pero cuando tiene un diseño complejo que puede cambiar con el tiempo, tener un archivo de diseño sería mejor y tendría menos necesidad de cambiar.