2012-02-19 19 views
9

Uso RelativeLayouts estesamente nella mia app e ho pensato di sapere come specificarli, ma questo mi ha perso. In pratica sto posizionando 4 TextView in due righe di due, ciascuna composta da un'etichetta e un testo che verranno forniti. Dovrebbe essere qualcosa di simile:Android layout_below non funziona

Nato: 23 agosto 1810 Mason Co., Kentucky

Morto: 15 luglio 1865 Cincinnati, Hamilton Co., Ohio

Questa è la quota di competenza del layout:

 <TextView android:id="@+id/birth_lbl" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:layout_below="@+id/given_layout" 
      android:layout_alignLeft="@+id/given_layout" 
      android:layout_marginTop="6dip" 
      style="@style/label" 
      android:text="@string/born" 
     /> 
     <TextView android:id="@+id/birth" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:layout_toRightOf="@+id/birth_lbl" 
      android:layout_alignBaseline="@+id/birth_lbl" 
      android:layout_marginLeft="10dip" 
      android:layout_marginRight="6dip" 
      style="@style/main_text" 
      android:text="dd Mmm yy" 
     /> 
     <TextView android:id="@+id/death_lbl" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:layout_below="@+id/birth" 
      android:layout_alignLeft="@+id/birth_lbl" 
      android:layout_marginTop="4dip" 
      style="@style/label" 
      android:text="@string/died" 
     /> 
     <TextView android:id="@+id/death" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:layout_toRightOf="@+id/death_lbl" 
      android:layout_alignLeft="@+id/birth" 
      android:layout_alignBaseline="@+id/death_lbl" 
      android:layout_marginRight="6dip" 
      style="@style/main_text" 
      android:text="dd Mmm yy" 
     /> 

Per qualche motivo, questo visualizza le visualizzazioni della linea di morte SOPRA le visualizzazioni della linea di nascita! Se cambio le specifiche della vista death_lbl per essere invece 'layout_below = "@ + id/birth_lbl"', le linee sono posizionate correttamente! Tuttavia, è possibile che la vista "nascita" si sposti su più righe, quindi ho davvero bisogno di posizionare la seconda riga sotto "nascita", non "birth_lbl".

Qualcuno conosce il motivo di questo comportamento? Si verifica sia nell'editor Layout grafico in Eclipse che in runtime sul mio tablet con Android 4.0.

+1

Il segno '+' nella dichiarazione 'id' dovrebbe essere usato solo alla prima comparsa di 'id'. Dovresti modificare e pubblicare il file di layout completo per vedere le viste extra che usi ('given_layout'?).L'ho provato nell'emulatore e per il mio funziona, ma ovviamente non ho la vista 'given_layout' in più. – Luksprog

+0

È perché, come ha detto Slukian, non sai nemmeno cosa stai facendo ... Smetti di usare il '+' dove vuoi e prova a considerare che ognuno di + hai è come creare una nuova variabile ... È anche carina strano che il compilatore non dica una parola su quello ... – Cehm

+2

Più delicatamente qui! Il compilatore di Android 21 mette questi elementi positivi quando si utilizza il "design". Il motivo per cui facciamo domande è che, come dici tu, non lo sappiamo. – user462990

risposta

13

Prova a cambiare android:layout_below="@+id/birth" in death_lbl a android:layout_below="@id/birth", perché a questo punto è già dichiarato, che il + implica, potrebbe portare a problemi quando si dichiara di nuovo.

+0

Grazie. In realtà lo sapevo e quello che hai visto nel mio codice di esempio era qualcosa che provavo disperatamente :-). L'ho rimesso come era con lo stesso risultato. – gordonwd

+0

ma quando lo faccio, non funziona e quando viene messo +, è lavoro! Perché? –

0

Il tuo problema è che stai chiamando le proprietà sul relativo layout come se lo stessi dichiarando di nuovo.

Quando si dichiara un ID per la vista, allora dovrebbe essere fatto in questo modo android:id="@+id/button" e quando si desidera Android per posizionare quel particolare vista sopra o sotto qualsiasi altra vista in un layout relativo si deve chiamare in questo modo android:layout_below="@id/textview"

Questo dice ad Android che hai dichiarato un pulsante con il pulsante id e vuoi che sia posizionato sotto la vista testo, ricorda di non usare @+id in postion view usa @id invece.

+0

Vedere il mio commento sopra. Grazie! – gordonwd

+1

questo non è del tutto corretto. se hai una vista o un gruppo di vista dichiarati sopra un altro nell'xml ma vuoi usare per esempio suRightOf o su LeftFor, puoi fare riferimento alla vista qui sotto usando @ + id e poi usare @ + id di nuovo o @id quando si imposta l'id del vista/viewgroup stesso. @ + id aggiungerà l'id alla tua R e quindi collegherà la vista che fa riferimento anche quando l'app è stata creata. – speedynomads

+0

@ domji84 Hai torto, non puoi fare riferimento a Views o, in realtà, a nessuna risorsa usando @ + id, il suo unico scopo è creare una nuova risorsa. Vedi questa risposta http://stackoverflow.com/a/5025971/892055 –

1

Se risolvere i vostri + segni non aiuta, si può sempre posizionare il id/death sotto id/birth, e poi mettere id/death_label toLeftOf id/death.

+0

Ho provato questo e non mi piace mettere niente sotto quell'identificazione/nascita. Ho intenzione di provare a codificare un caso più isolato in un file separato prima di andare oltre con questo. Grazie! – gordonwd

1

Ero effettivamente in grado di duplicare questo fenomeno codificando uno layout temporaneo con solo quei campi, ed è stato in grado di determinare che il problema è andato via se non ho posizionato la vista iniziale birth_lbl relativa alla vista sopra di esso (" given_layout "in questo caso).

quindi non sono sicuro se questo è classificato come una correzione, una soluzione, o un kludge (che è ancora una parola in questi giorni?), Ma quello che ho fatto è stato quello di posizionare il punto di vista del testo all'interno della propria RelativeLayout e posizionare lo RelativeLayout relativo a id/given_layout. In ogni caso, funziona ...

2

Sono stato anche affrontando lo stesso problema, perché stavo usando il layout vincolo, ma align_below funziona solo in layout relativo. quindi controlla quale layout stai usando.