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í
- Relleno de ScrollView
- Vista de imagen de Android Autoscroll
- Establecer una imagen en el elemento ListView utilizando SimpleCursorAdapter y ViewBinder
- SetShadowLayer provoca lento tiempo de dibujo en GridView?
- ImageView dentro de RelativeLayout tiene relleno superior e inferior
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).
- Cómo reasignar una imagen de 9 parches mediante programación a un ImageView?
- ¿Cómo obtienes efecto de rizo para extender los límites de vista pasados?
- Cómo saber si Ver dentro de Desplazamiento es visible completamente o no
- Cuando es necesario ejecutar invalidate () en una vista?
- Implementar android: src = "@ drawable / image" mediante programación en Android
- Cargar imágenes en GridView con Universal Image Loader
- Rotación a un ImageView, dentro de un RelativeLayout
- Creación de una vista de imagen dibujable y zoomable en android
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?
- Res / layout / may_layout.xml
- 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)
- Cómo hacer una aplicación de radio FM en Android
- RxJava: Se produjo un error al intentar propagar el error a Observer.onError