2011-12-05 9 views
6

Sto seguendo this tutorial per informazioni sui layout lineari. Ecco il file di layout principale:Perché l'attributo LinearLayout "layout_weight" sembra fare l'opposto di ciò che penso che dovrebbe fare?

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:orientation="vertical" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent"> 

    <LinearLayout 
     android:orientation="horizontal" 
     android:layout_width="fill_parent" 
     android:layout_height="fill_parent" 
     android:layout_weight="1"> 
     <TextView 
      android:text="red" 
      android:gravity="center_horizontal" 
      android:background="#aa0000" 
      android:layout_width="wrap_content" 
      android:layout_height="fill_parent" 
      android:layout_weight="1"/> 
     <TextView 
      android:text="green" 
      android:gravity="center_horizontal" 
      android:background="#00aa00" 
      android:layout_width="wrap_content" 
      android:layout_height="fill_parent" 
      android:layout_weight="1"/> 
     <TextView 
      android:text="blue" 
      android:gravity="center_horizontal" 
      android:background="#0000aa" 
      android:layout_width="wrap_content" 
      android:layout_height="fill_parent" 
      android:layout_weight="1"/> 
     <TextView 
      android:text="yellow" 
      android:gravity="center_horizontal" 
      android:background="#aaaa00" 
      android:layout_width="wrap_content" 
      android:layout_height="fill_parent" 
      android:layout_weight="1"/> 
    </LinearLayout> 

    <LinearLayout 
    android:orientation="vertical" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    android:layout_weight="1"> 
    <TextView 
     android:text="row one" 
     android:textSize="15pt" 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" 
     android:layout_weight="1"/> 
    <TextView 
     android:text="row two" 
     android:textSize="15pt" 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" 
     android:layout_weight="1"/> 
    <TextView 
     android:text="row three" 
     android:textSize="15pt" 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" 
     android:layout_weight="1"/> 
    <TextView 
     android:text="row four" 
     android:textSize="15pt" 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" 
     android:layout_weight="1"/> 
    </LinearLayout> 

</LinearLayout> 

che produce questo:

linear layout example

stavo sperimentando con il tentativo di rendere le barre colorate in alto (il primo figlio del layout) in verticale il doppio grande come le righe orizzontali in basso (l'ultimo bambino) rendendo peso la layout del primo bambino due volte il secondo bambino:

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:orientation="vertical" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent"> 

    <LinearLayout 
     android:orientation="horizontal" 
     android:layout_width="fill_parent" 
     android:layout_height="fill_parent" 
     android:layout_weight="2"> 
     <TextView 
      android:text="red" 
      android:gravity="center_horizontal" 
      android:background="#aa0000" 
      android:layout_width="wrap_content" 
      android:layout_height="fill_parent" 
      android:layout_weight="1"/> 
     <TextView 
      android:text="green" 
      android:gravity="center_horizontal" 
      android:background="#00aa00" 
      android:layout_width="wrap_content" 
      android:layout_height="fill_parent" 
      android:layout_weight="1"/> 
     <TextView 
      android:text="blue" 
      android:gravity="center_horizontal" 
      android:background="#0000aa" 
      android:layout_width="wrap_content" 
      android:layout_height="fill_parent" 
      android:layout_weight="1"/> 
     <TextView 
      android:text="yellow" 
      android:gravity="center_horizontal" 
      android:background="#aaaa00" 
      android:layout_width="wrap_content" 
      android:layout_height="fill_parent" 
      android:layout_weight="1"/> 
    </LinearLayout> 

    <LinearLayout 
    android:orientation="vertical" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    android:layout_weight="1"> 
    <TextView 
     android:text="row one" 
     android:textSize="15pt" 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" 
     android:layout_weight="1"/> 
    <TextView 
     android:text="row two" 
     android:textSize="15pt" 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" 
     android:layout_weight="1"/> 
    <TextView 
     android:text="row three" 
     android:textSize="15pt" 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" 
     android:layout_weight="1"/> 
    <TextView 
     android:text="row four" 
     android:textSize="15pt" 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" 
     android:layout_weight="1"/> 
    </LinearLayout> 

</LinearLayout> 

Ma questo fa l'opposto del mio risultato previsto: in realtà rende le barre colorate verticalmente più piccole di circa la metà.

La documentazione per gli sviluppatori Android specificano che

any remaining space in the view group is assigned to children in the proportion of their declared weight 

Perché sembra come l'inverso è vero?

+3

È EFFETTIVAMENTE invertire. Quello che vuoi essere più grande dovrebbe avere un numero minore di peso. – Hiral

+0

@Hiral cura di sostenere ciò? È sempre vero o solo quando usi 'fill_parent'? So che è vero il contrario quando dai punti di vista concorrenti lo spazio zero inizia con – Craigy

+0

@Craigy: in realtà non so quale comportamento si ripeta esattamente con vari casi.ma quasi sempre, agisce in modo opposto come descritto.ma si, a volte agisce in modo diverso.Non conoscevo la ragione in quel momento.ma ora penso che fill_parent potrebbe influenzare il suo comportamento come hai detto tu. – Hiral

risposta

10

Enfasi sulla ogni residuo spazio ...

penso che sia un conflitto tra l'utilizzo fill_parent per l'altezza e il peso di layout. Prova a impostare android:layout_height="0dp" per entrambi i LinearLayout s.

5

layout_weight viene normalmente utilizzato con layout_width o layout_height impostato su wrap_content. Provalo, vedrai che aumenta la dimensione del layout in base a quale vista ha il peso maggiore.

Esempio

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:orientation="vertical" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent"> 

    <LinearLayout 
     android:orientation="horizontal" 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" 
     android:layout_weight="2"> 
     <TextView 
      android:text="red" 
      android:gravity="center_horizontal" 
      android:background="#aa0000" 
      android:layout_width="wrap_content" 
      android:layout_height="fill_parent" 
      android:layout_weight="1"/> 

    </LinearLayout> 

    <LinearLayout 
    android:orientation="vertical" 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:layout_weight="1"> 
    <TextView 
     android:text="row one" 
     android:textSize="15pt" 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" 
     android:layout_weight="1"/> 

    </LinearLayout> 

</LinearLayout> 
3
<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    android:orientation="vertical" android:weightSum="3"> 

    <LinearLayout 
     android:layout_width="fill_parent" 
     android:layout_height="0dp" 
     android:layout_weight="2" 
     android:orientation="horizontal" > 

     <TextView 
      android:layout_width="wrap_content" 
      android:layout_height="fill_parent" 
      android:layout_weight="1" 
      android:background="#aa0000" 
      android:gravity="center_horizontal" 
      android:text="red" /> 

     <TextView 
      android:layout_width="wrap_content" 
      android:layout_height="fill_parent" 
      android:layout_weight="1" 
      android:background="#00aa00" 
      android:gravity="center_horizontal" 
      android:text="green" /> 

     <TextView 
      android:layout_width="wrap_content" 
      android:layout_height="fill_parent" 
      android:layout_weight="1" 
      android:background="#0000aa" 
      android:gravity="center_horizontal" 
      android:text="blue" /> 

     <TextView 
      android:layout_width="wrap_content" 
      android:layout_height="fill_parent" 
      android:layout_weight="1" 
      android:background="#aaaa00" 
      android:gravity="center_horizontal" 
      android:text="yellow" /> 
    </LinearLayout> 

    <LinearLayout 
     android:layout_width="fill_parent" 
     android:layout_height="0dp" 
     android:layout_weight="1" 
     android:orientation="vertical" > 

     <TextView 
      android:layout_width="fill_parent" 
      android:layout_height="wrap_content" 
      android:layout_weight="1" 
      android:text="row one" 
      android:textSize="15pt" /> 

     <TextView 
      android:layout_width="fill_parent" 
      android:layout_height="wrap_content" 
      android:layout_weight="1" 
      android:text="row two" 
      android:textSize="15pt" /> 

     <TextView 
      android:layout_width="fill_parent" 
      android:layout_height="wrap_content" 
      android:layout_weight="1" 
      android:text="row three" 
      android:textSize="15pt" /> 

     <TextView 
      android:layout_width="fill_parent" 
      android:layout_height="wrap_content" 
      android:layout_weight="1" 
      android:text="row four" 
      android:textSize="15pt" /> 
    </LinearLayout> 

</LinearLayout> 

enter image description here

Specificare Android: weightSum per il layout genitore e anche Android: layout_height = "0DP" per i layout del bambino. Per favore prova questo. Spero che questo sarebbe di aiuto.

+1

La risposta è stata utile. Ma sembra che tu non abbia bisogno dell'androide: weightSum specificato. Secondo la documentazione di Android: "Se non specificato, la somma viene calcolata aggiungendo il peso di layout di tutti i bambini." – Aishwar

Problemi correlati