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?
- res / layout / may_layout.xml
- 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.