2011-12-17 7 views
33

Ho un RelativeLayout che contiene una coppia di pulsanti side-by-side, che voglio essere centrato all'interno del layout. Potrei semplicemente mettere i pulsanti in un LinearLayout e centrarlo rispetto a RelativeLayout, ma voglio mantenere il mio xml il più pulito possibile.Centrare più oggetti in un RelativeLayout senza metterli in un contenitore?

Ecco quello che ho provato, questo mette solo il pulsante "applica" al centro e il pulsante a sinistra di esso "undo":

<RelativeLayout 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:layout_marginTop="15sp"> 
    <TextView 
    android:id="@+id/instructions" 
    android:text="@string/instructions" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_marginBottom="15sp" 
    android:layout_centerHorizontal="true" 
    /> 
    <Button 
    android:id="@+id/apply" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_centerInParent="true" 
    android:text="@string/apply" 
    android:textSize="20sp" 
    android:layout_below="@id/instructions" 
    /> 
    <Button 
    android:id="@+id/undo" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_centerInParent="true" 
    android:text="@string/undo" 
    android:textSize="20sp" 
    android:layout_toLeftOf="@id/apply" 
    android:layout_below="@id/instructions" 
    /> 
</RelativeLayout> 

risposta

57

android:gravity allineerà il contenuto all'interno dello view o layout utilizzato.

android:layout_gravity allineerà lo view o layout all'interno del suo genitore.

Così aggiungendo

android:gravity="center" 

al RelativeLayout dovrebbe fare il trucco ...

Ti piace questa:

<RelativeLayout 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:gravity="center" 
    android:layout_marginTop="15sp"> 

</RelativeLayout> 
+0

Puoi dare un esempio di layout per favore? Non vedo come questo possa funzionare perché devi posizionare un pulsante a sinistra del secondo e il contrario, che è una dipendenza circolare. Che lancia un IllegalStateException in un RelativeLayout. –

+0

Testato me stesso ... basta usare il codice nella domanda e aggiungere la linea come ho detto ... – BrainCrash

+0

Ohh, vedo, mi mancava interpretato "center in RelativeLayout" sia verticale che orizzontale - in opposizione al centro orizzontale sotto la vista testo. Questo ha senso allora. –

2

LinearLayout è una buona opzione. Oltre a questo ci sono opzioni come creare una vista invisibile e centrare quella e quindi allineare il pulsante sinistro a sinistra e destra a destra di esso. MA quelli sono solo di lavoro.

+0

Sì, è una brutta soluzione, ma è il migliore che ho trovato. O create la vista spaziatore o create un RelativeLayout/LinearLayout che contiene, quindi in ogni caso è necessario gonfiare un'altra vista, ma ciò evita il sovraccarico di avere ViewGroup nidificati. –

+0

@havexz Ci scusiamo per il downvote, perché in realtà ho incorporato un layout separato per ottenere il centraggio di cui avevo bisogno. Ero troppo sbrigativo per scartare la tua risposta b/c il problema specifico qui era più "pulito" risolto dalla risposta di BrianCrash. Tuttavia, quando ho spinto questa soluzione un po 'più avanti, non è stato sufficiente. Né mi permetterà di annullare o upvote? – samosaris

+0

@SamusArin Per annullare una votazione, fare nuovamente clic sull'icona di votazione. – mindriot

5
android:layout_gravity="center" 

darà quasi quello che stai cercando.

+0

Omg, hai risposto esattamente allo stesso tempo di BrianCrash. Ho downvoted b/c ho pensato che hai copiato la sua risposta. Mi dispiace amico (cercherò di aggiustare il downvote)! – samosaris

+0

Ok, tutto meglio (grazie alla modifica di Jean). – samosaris

4

Qui è una combinazione di quanto sopra la risposta di che ha risolto la mia situazione specifica :

Centratura di due etichette separate all'interno di un layout che include anche un pulsante nella parte più a sinistra dello stesso layout (pulsante, etichetta, etichetta, da sinistra a destra, in cui le etichette sono centrate rispetto al layout contenente tutte e tre le viste - ovvero, il pulsante non spinge le etichette fuori dal centro) .

Ho risolto questo problema annidando due RelativeLayout, dove il layout più esterno includeva il pulsante e un Inner-RelativeLayout.

Inner-RelativeLayout conteneva le due etichette di testo (TextView).

Ecco un frammento che fornisce i dettagli di come è stato fatto il centraggio e altre cose di layout:

vedere: RelativeLayout Gravity not applied? e Gravity and layout_gravity on Android per la differenza di tra gravità e layout_gravity.

Tweak the padding Left sul pulsante btn_button1 per vedere che i TextView non si muovono.

(Le mie scuse per havexz per i downvotes. Ero troppo frettoloso nel pensare che solo i vostri suggerimenti non risolvessero la domanda esatta, che aiutano a risolvere situazioni molto simili (la risposta qui risolve una situazione molto specifica, e solo la combinazione di tutte queste risposte ha risolto il mio problema.Ho provato a fare upvoting, ma non me lo permetterà se non modifico la risposta, che non voglio fare.)

<RelativeLayout 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@+id/rl_outer" 
    android:layout_width="fill_parent" 
    android:layout_height="50dip" 
    android:background="#FF0000FF"> 

    <Button 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@+id/btn_button1" 
    android:layout_width="wrap_content" 
    android:layout_height="fill_parent" 
    android:background="#FF00FF00" 
    android:text="&lt;" 
    android:textSize="20sp" 
    android:paddingLeft="40dip"/> 

    <RelativeLayout 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@+id/rl_inner" 
    android:layout_width="wrap_content" 
    android:layout_height="fill_parent" 
    android:background="#FFFF00FF"   
    android:layout_centerInParent="true" 
    android:gravity="center">  

    <TextView 
     xmlns:android="http://schemas.android.com/apk/res/android" 
     android:id="@+id/tv_text1" 
     android:layout_width="wrap_content" 
     android:layout_height="fill_parent" 
     android:background="#FF505050" 
     android:textSize="20sp" 
     android:textColor="#FFFFFFFF" 
     android:text="Complaint #" 
     android:gravity="center"/>  

    <TextView 
     xmlns:android="http://schemas.android.com/apk/res/android" 
     android:id="@+id/tv_text2" 
     android:layout_width="wrap_content" 
     android:layout_height="fill_parent" 
     android:background="#FF505050" 
     android:textSize="20sp" 
     android:textColor="#FFFFFFFF" 
     android:layout_toRightOf="@id/tv_text1" 
     android:gravity="center"/> 

    </RelativeLayout> 
</RelativeLayout> 
+1

android: layout_centerInParent = "true" ha fatto il trucco –

8

Ecco un'estensione della risposta di BrainCrash. È un'opzione non annidata che raggruppa e centra tutti e tre orizzontalmente e verticalmente. Inoltre, occupa il massimo TextView e lo centra orizzontalmente su entrambi i pulsanti. Se lo si desidera, è possibile centrare il testo all'interno di TextView con Android: gravità = "centro". Ho anche rimosso i margini, aggiunto il colore e impostato l'altezza RelativeLayout su fill_parent per evidenziare il layout. Testato su API 11.

<RelativeLayout 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    android:gravity="center" 
    android:background="@android:color/black" 
    > 
    <TextView 
    android:id="@+id/instructions" 
    android:text="TEST" 
    android:textSize="20sp" 
    android:background="@android:color/darker_gray" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_centerHorizontal="true" 
    android:layout_alignLeft="@+id/undo" 
    android:layout_alignRight="@+id/apply" 
    android:gravity="center" 
    /> 
    <Button 
    android:id="@+id/apply" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_centerInParent="true" 
    android:text="APPLY" 
    android:textSize="20sp" 
    android:layout_below="@id/instructions" 
    /> 
    <Button 
    android:id="@+id/undo" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_centerInParent="true" 
    android:text="UNDO" 
    android:textSize="20sp" 
    android:layout_toLeftOf="@id/apply" 
    android:layout_below="@id/instructions" 
    /> 
</RelativeLayout> 
Problemi correlati