2012-03-17 10 views
28

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).Controlar la visibilidad de vista desde un recurso

he intentado 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/valores/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/valores de la tierra /integers.xml:

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

B ut Obtengo un error de tiempo de ejecución (índice fuera de límite) cuando intento inflar las imágenes. Cuando elimino las declaraciones de Android: visibilidad, el programa se ejecuta pero veo ambas imágenes.

P: ¿Cuál es la forma de utilizar un recurso como valor para el atributo android: visibility?

(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).

Respuesta

23

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

me refiero en el archivo en la carpeta styles.xmlvalues puso un estilo con nombre s1, y puso android:visibility=visible en eso, y en styles.xml en la carpeta values-land puso un estilo con nombre s1, y puso android:visibility=gone.

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

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

solución proporcionada por dear 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á menos necesidad de cambiar.

+0

Gracias Keyhan, voy a intentarlo e informar aquí. ¿Este enfoque también ayudará con esta pregunta? http://stackoverflow.com/questions/9745227/setting-programmatically-the-pixel-size-of-a-remote-imageview. Tengo 5 tamaños diferentes por dos modos (retrato y langscape). Use el estilo también para controlar el tamaño de ImageView? De esta manera tendré un diseño único con dos imágenes y 5 pares de estilos de orientación/retrato. (trabajar alrededor de las limitaciones de RemoteViews no es divertido ;-)). – user1139880

+0

Funciona bien. ¡Esta fue una gran ayuda!. Gracias Keyhan. – user1139880

+0

La solución sugerida implica el uso de [Style Resources] (http://developer.android.com/guide/topics/resources/style-resource.html) – denispyr

0

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

¿Por qué no usa 2 diseños?

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

cual cada definir el imageview correcta para mostrar.

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

+1

Gracias Calvin. Intentaba evitar duplicar el diseño, a menos que pueda generarlos automáticamente a partir de una plantilla en tiempo de compilación. No sé si eclipse lo admite y qué estándar tendrá. – user1139880

39

Ésta es una vieja cuestión que ya ha sido aceptado, pero la solución siguiente puede ayudar a alguien más:

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

<!-- 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 convierte en (0, 1, 2) respectivamente. Por lo tanto, se puede declarar los recursos enteros que contienen estos valores así:

valores/integers.xml

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

valores de la tierra/integers.xml

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

Sin embargo, si usted quiere hacer es aún mejor para dejar de adivinar estas constantes numéricas cada vez, puede 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 --> 

valores de la tierra/integers.xml

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

Usted puede utilizar este método o el sugerido por Keyhan. Elija el que le quede mejor.

+5

También funciona declarando como '' en lugar de '' – TalkLittle

+0

la buena práctica sería mantener los valores originales de Android visibles, invisibles y desaparecidos (no 0, 1, 2, pero 0, 4, 8) –

+3

Bien , eso no es exactamente como funciona. Si marca el código de clase 'View', estos valores (0, 1 y 2) se utilizan para acceder a las posiciones de este miembro:' private static final int [] VISIBILITY_FLAGS = {VISIBLE, INVISIBLE, GONE}; '. Es por eso que no puede usar 0, 4 y 8, porque 0, 1 y 2 representan los índices VISIBLE, INVISIBLE y GONE. –

Cuestiones relacionadas