Controlar la visibilidad de la vista desde un recurso

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 puedo lograrlo utilizando recursos? (Sé cómo configurarlo de forma programática para, pero este uso específico que necesito para lograrlo utilizando recursos).

Probé algo así

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 consigo 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 valor para el atributo android: visibility?

(Si te preguntas por qué configurarlo de forma programática no me ayudará, tiene que ver con el cambio automático de espacio / retrato de widgets de aplicación con archivos bitmap de uri).

Será posible cuando utilice este truco, añada su línea de visibilidad a un estilo y ponga dos instancias de ese archivo en -land y modo normal.

Quiero decir en el archivo styles.xml en los values carpeta poner un estilo con el nombre s1 , y poner android:visibility=visible en eso, y en styles.xml en la carpeta values-land poner un estilo con el nombre s1 , y poner android:visibility=gone

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

Y luego, ajuste s1 a la primera vista de la imagen y s2 a la segunda.

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

Esta es una vieja pregunta 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 de la siguiente manera:

  <!-- 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, ido) que se convertirá en (0, 1, 2), respectivamente. Por lo tanto, puede declarar recursos enteros que contengan estos valores como este:

Values ​​/ integers.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 quieres hacerlo aún mejor para dejar de adivinar estas constantes numéricas cada vez, puedes hacer esto:

Values ​​/ integers.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 utilizar este enfoque o el sugerido por Keyhan. Elija el que mejor se adapte a usted.

No es posible. (Traté de definir fill_parent como cadena y usarlo 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 imagen correcta para mostrar.

Además, tener valores-tierra puede causar problemas cuando necesite soportar varios idiomas. (Tendrá que tener valor-xx-land para cada idioma)

  • Diferencia entre setAlpha y setImageAlpha
  • ImageView no escala en dispositivos de pantalla grande
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.