2012-03-17 10 views
28

Ho un layout che contiene due ImageViews. Voglio che uno di loro sia visibile in verticale e l'altro in orizzontale. Come posso raggiungerlo usando le risorse? (So ​​come impostarlo a livello di codice, ma questo uso specifico è necessario per ottenerlo usando le risorse).Controllo della visibilità delle viste da una risorsa

ho provato qualcosa di simile

in 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" 
     ... 
/> 

in res/valori/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> 

in res/valori-terra /integers.xml:

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

B io ottengo un errore di runtime (indice fuori limite) quando provo a gonfiare le immagini. Quando rimuovo l'androide: le dichiarazioni di visibilità, il programma viene eseguito ma vedo entrambe le immagini.

D: Qual è il modo di utilizzare una risorsa come valore per Android: attributo di visibilità?

(se ti chiedi perché impostarlo a livello di codice non mi sarà d'aiuto, ha a che fare con lo scambio automatico di spazio/ritratto di widget di app con file uri bitmap).

risposta

23

sarà possibile quando si utilizza questo trucco, aggiungere la linea di visibilità a uno stile e inserire due istanze di quel file in modalità normale e in -land.

voglio dire nel file di styles.xml nella cartella values messo uno stile con nome s1, e mettere android:visibility=visible in quella, e in styles.xml nella cartella values-land messo uno stile con nome s1, e mettere android:visibility=gone.

anche, nel file di styles.xml nella cartella values mettere uno stile con nome s2, e mettere android:visibility=gone in quella, e in styles.xml nella cartella values-land mettere uno stile con nome s2, e mettere android:visibility=visible.

e quindi impostare s1 alla prima vista di immagini e s2 al secondo.

La soluzione fornita da caro Calvin è corretta, ma quando si dispone di un layout complesso che potrebbe cambiare nel tempo, disporre di un file di layout sarebbe migliore e avrà meno bisogno di cambiare.

+0

Grazie Keyhan, farò un tentativo e riferire qui. Questo approccio aiuterà anche con questa domanda? http://stackoverflow.com/questions/9745227/setting-programmatically-the-pixel-size-of-a-remote-imageview. Ho 5 diverse dimensioni per due modalità (ritratto e langscape). Usa lo stile anche per controllare le dimensioni di ImageView? In questo modo avrò un layout unico con due immagini e 5 coppie di stili di orientamento/ritratto. (aggirare i limiti di RemoteViews non è divertente ;-)). – user1139880

+0

Funziona bene. Questo è stato un grande aiuto!. Grazie Keyhan. – user1139880

+0

La soluzione suggerita prevede l'utilizzo di [Risorse di stile] (http://developer.android.com/guide/topics/resources/style-resource.html) – denispyr

0

Non è possibile. (Ho provato a definire fill_parent come stringa e usarlo per layout_width e fallisce anche.)

Perché non usi 2 layout?

  1. res/layout/may_layout.xml
  2. res/layout terra/may_layout.xml

cui ogni definire l'ImageView corretta per mostrare.

Inoltre, avere valori-terra può causare problemi quando è necessario supportare multi-lingue. (Sarà necessario avere valore xx-land per ogni lingua)

+1

Grazie Calvin. Stavo cercando di evitare la duplicazione del layout, a meno che non riesca a generarli automaticamente da un modello in fase di compilazione. Non so se Eclipse lo supporta e come sarà lo standard. – user1139880

39

Questa è una vecchia questione che è già stata accettata, ma la seguente soluzione può aiutare qualcun altro:

Se si controlla res/valori/attrs.xml nel codice sorgente di Android, vedrete la definizione di proprietà di visibilità simili:

<!-- 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> 

questo attributo prevede un valore stringa (visibile, invisibile, va) che sarà convertita in (0, 1, 2) rispettivamente. Quindi, è possibile dichiarare le risorse interi contenenti questi valori come questo:

valori/integers.xml

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

valori-terra/integers.xml

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

Tuttavia, se si vuole fare è ancora meglio per smettere di indovinare queste costanti numeriche ogni volta, puoi fare così:

valori/interi.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 --> 

valori-terra/integers.xml

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

È possibile utilizzare questo metodo o quello suggerito da Keyhan. Scegli quello che ti sta meglio.

+5

Funziona anche dichiarandoli come '' piuttosto che '' – TalkLittle

+0

la buona pratica sarebbe mantenere i valori originali di Android visibili, invisibili e andati (non 0, 1, 2, ma 0, 4, 8) –

+3

Bene , non è esatto come funziona. Se si controlla il codice di classe 'View', questi valori (0, 1 e 2) vengono utilizzati per accedere alle posizioni di questo membro:' private static final int [] VISIBILITY_FLAGS = {VISIBLE, INVISIBLE, GONE}; '. Ecco perché non puoi usare 0, 4 e 8, perché 0, 1 e 2 stanno per indici VISIBILI, INVISIBILI e GONI. –

Problemi correlati