Tengo un layout que contiene dos ImageViews. Quiero que uno de ellos sea visible en vertical y otra en horizontal. ¿Cómo puedo lograr que el uso de los recursos? (Yo sé cómo establecer mediante programación, pero este uso específico que necesitan para lograr que el uso de los recursos).

He intentado algo 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 me da un error en tiempo de ejecución (índice de fuera de juego) cuando tratando de inflar las imágenes. Cuando me quite el android:visibilidad de las declaraciones, el programa se ejecuta, pero veo que ambas imágenes.

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

(si usted se pregunta ¿por qué establecer mediante programación no me va a ayudar, tiene que ver con la automática de paisaje/retrato cambiar de app widgets con uri del archivo de mapas de bits).

InformationsquelleAutor user1139880 | 2012-03-17

3 Comentarios

  1. 26

    será posible cuando se utiliza este truco, agregar la visibilidad de la línea a un estilo y poner dos instancias de ese archivo en la tierra y el modo normal.

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

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

    y, a continuación, establezca s1 a primera imageview y s2 a segunda.

    solución dada por la querida de Calvin es también correcto, pero si usted tiene un complejo diseño que puede cambiar con el tiempo, tener un archivo de diseño sería mejor, y tendrá menos necesidad de cambiar.

    • Gracias Keyhan, voy a darle una oportunidad y el informe aquí. Será este enfoque también ayuda con esta pregunta? stackoverflow.com/questions/9745227/… . Tengo 5 diferentes tamaños veces dos modos de retrato y langscape). Utilice el estilo también para el control de la ImageView tamaño? De esta manera voy a tener un diseño único con dos imágenes y 5 pares de orientación/retrato de estilos. (trabajo en torno a las limitaciones de RemoteViews no es divertido ;-)).
    • Funciona bien. Esta fue una gran ayuda!. Gracias Keyhan.
    • La solución propuesta consiste en el uso de la Recursos de Estilo
    • Muy inteligente! y funciona bien, gracias.
    • Lo que es un truco!!!
    • La creación de todo un estilo de establecer un atributo no es una buena práctica, especialmente si necesita configurar más atributos en los estilos ya (usted no puede tener dos estilos en una vista). Flávio de la respuesta es mucho más limpio.

  2. 50

    Esta es una vieja cuestión que ya ha sido aceptado, pero la siguiente solución puede ayudar a alguien:

    Si usted llega res/values/attrs.xml en Android el código fuente, verás que la definición de la visibilidad de la propiedad 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 se espera un valor de cadena (visible, invisible, se ha ido), que se convertirá en (0, 1, 2), respectivamente. Así, se puede declarar el entero de los recursos que contienen estos valores como:

    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 en el fin de dejar de adivinar estas constantes numéricas a cada momento, se podría hacer así:

    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 método o el sugerido por Keyhan. Elegir el que se adapte a usted mejor.

    • También funciona declarándolos <integer> en lugar de <string>
    • la buena práctica sería la de mantener el original de android valores visibles, invisibles y se ha ido (no 0, 1, 2,, 0, 4, 8)
    • Bueno, eso no exaclty cómo funciona. Si marca la View código de la clase, 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 se puede usar 0, 4 y 8, debido a los 0, 1 y 2 de pie para VISIBLE, INVISIBLE y se ha IDO índices.
    • Los alias no me funciona (es decir,view_visible). Esto solo funciona si puedo asignar 0, 1, 2 enteros de recursos que puedo utilizar directamente. (pero +1 por que poco!!)
    • De android.view.View#VISIBLE``android.view.View#INVISIBLE y android.view.View#GONE valores de las variables debe ser <enum name="visible" value="0" /> <enum name="invisible" value="4" /> <enum name="gone" value="8" />
  3. 0

    No es posible. (Traté de definir fill_parent como cadena y usarla para layout_width y se produce un error demasiado.)

    ¿Por qué no utilizar 2 diseños?

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

    Que cada definen la correcta imageview para mostrar.

    Además, los valores de la tierra puede causar problema cuando usted necesita soporte multi-idiomas. (Usted tendrá que tener valor-xx-de la tierra para cada idioma)

    • Gracias De Calvin. Yo estaba tratando de evitar la duplicación del diseño, a menos que se puede generar automáticamente a partir de una plantilla en tiempo de compilación. No sé si eclipse soporta y cómo estándar será.

Dejar respuesta

Please enter your comment!
Please enter your name here