2011-01-18 6 views
30

Ta zagadka mnie zastanawia od pierwszych kroków z Androidem. Nie mogę uczynić obu kolumn w 2-kolumnowej tabeli TableLayout dokładnie po 50%.2-kolumna TableLayout z 50% dokładnie dla każdej kolumny

Oto przykład:

<ScrollView 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_height="wrap_content" 
    android:layout_width="fill_parent" > 

    <TableLayout 
     android:id="@+id/tablelayout" 
     android:layout_height="wrap_content" 
     android:layout_width="fill_parent" 
     android:paddingRight="2dip" > 

     <TableRow> 
      <TextView 
       style="@style/TextViewStandard" 
       android_layout_span="2" 
       android:layout_weight="1" 
       android:text="Bla" /> 
     </TableRow> 

     <TableRow> 
      <TextView 
       style="@style/TextViewStandard" 
       android:layout_weight="1" 
       android:text="Name:" /> 

      <EditText 
       style="@style/EditTextStandard" 
       android:id="@+id/et_name" 
       android:layout_weight="1" /> 
     </TableRow> 

     <TableRow> 
      <TextView 
       style="@style/TextViewStandard" 
       android:layout_weight="1" 
       android:text="URL:" /> 

      <EditText 
       style="@style/EditTextStandard" 
       android:id="@+id/et_url" 
       android:layout_weight="1" /> 
     </TableRow> 

     <TableRow> 
      <Button 
       style="@style/ButtonStandard" 
       android:layout_column="0" 
       android:layout_marginTop="6dip" 
       android:onClick="onClickOk" 
       android:text="@android:string/ok" /> 
     </TableRow> 
    </TableLayout> 
</ScrollView> 

A oto odpowiednia definicja stylu:

<resources> 
    <style name="ButtonStandard" parent="@android:style/Widget.Button"> 
     <item name="android:layout_height">wrap_content</item> 
     <item name="android:layout_width">fill_parent</item> 
    </style> 

    <style name="EditTextStandard" parent="@android:style/Widget.EditText"> 
     <item name="android:layout_height">wrap_content</item> 
     <item name="android:layout_marginLeft">2dip</item> 
     <item name="android:layout_marginRight">2dip</item> 
     <item name="android:layout_marginTop">2dip</item> 
     <item name="android:layout_width">fill_parent</item> 
    </style> 

    <style name="TextViewStandard" parent="@android:style/Widget.TextView"> 
     <item name="android:layout_height">wrap_content</item> 
     <item name="android:layout_marginLeft">2dip</item> 
     <item name="android:layout_marginRight">2dip</item> 
     <item name="android:layout_marginTop">2dip</item> 
     <item name="android:layout_width">fill_parent</item> 
     <item name="android:textColor">@android:color/white</item> 
    </style> 
</resources> 

Staje się to naprawdę pomieszane z CheckBox zaangażowanych.

Co jest nie tak z moją definicją?

Wielkie dzięki z góry. HJW

Odpowiedz

60

Czy próbowałeś ustawić atrybut android:layout_width na 0dp (i oczywiście zachować android:layout_weight jako 1) na widokach podrzędnych?

Byłem w podobnych scenariuszach, gdy chciałem równomiernie rozdzielić daną przestrzeń między dwoma widokami podrzędnymi, ale nie udało mi się tego zrobić, ponieważ dziecko z "szerszą treścią" również stało się szersze, w obrębie rodzica, niż jego rodzeństwo. Wynikało to z faktu, że szersze dziecko miało większą początkową szerokość. Upewniając się, że oba dzieci zaczynają od tej samej szerokości (android:layout_width="0dp" na obu), gwarantują równomierną dystrybucję między nimi.

+11

Co więcej, jeśli to zrobisz, zrzuć 'TableLayout' i przejdź do' LinearLayout'. 'TableLayout' jest przeznaczony do przypadków, w których potrzebujesz systemu Android do obliczania szerokości kolumn w oparciu o zawartość komórki. Jeśli celowo to ignorujesz, możesz zamiast tego używać zagnieżdżonych 'LinearLayouts'. – CommonsWare

+0

@ChristianB: Dzięki za wyjaśnienie. Zawsze myślałem, że z TableLayout musi być coś "nie tak". Co ciekawe wiele wadliwych TableLayouts działa doskonale z emulatorem 2.3. @dbm: Z ustawieniem layout_width na 0dp zniknęły wszystkie widoki podrzędne (TextView/EditText). Dzięki i tak. Sprawdzę rozwiązanie CommonsWares i całkowicie usunę TableLayouts. Nie wiem, do czego są one dobre, jeśli chcesz wiedzieć, co może być w nich wydrukowane i może je zepsuć ... –

+2

@CommonsWare: Nie mogę uwierzyć, dlaczego brałem TableLayouts? Zmiana ich na LinearLayout działała idealnie. Dziękuję Ci bardzo. –

0

Kolumny w tabeli android zawsze dostosowują się do najszerszego widoku, który w dowolnym rzędzie. W kolumnach nie ma wyraźnej kontroli. Widok siatki ma większą kontrolę nad rozmiarem kolumny, na przykład: android: columnWidth = "100dp"

Jeśli lewy i prawy widok w tabeli byłby ustawiony na ten sam rozmiar, wówczas tabela środkowa mogłaby mieć dwie kolumny o 50% odstępach .

17

Utworzę układ tabeli Wewnątrz układu ramek trzymającego kontrolę. W tym przykładzie mam układ dwóch kolumn i umieszczam dwa obrazki wyśrodkowane w każdej kolumnie.

<TableLayout 
     android:layout_width="fill_parent" 
     android:layout_height="fill_parent" 
     android:stretchColumns="1"> 

     <TableRow> 
      <FrameLayout 
       android:layout_height="wrap_content" 
       android:layout_width="0dp" 
       android:layout_weight="1"> 

       <ImageView android:layout_width="wrap_content" 
        android:layout_height="wrap_content" 
        android:src="@drawable/button_wedding_day_cheat_sheet" 
        android:id="@+id/buttonWeddingDayCheatSheet" 
        android:onClick="onClickWeddingDayCheatSheet" 
        android:layout_gravity="center_horizontal"> 
       </ImageView> 
      </FrameLayout> 

      <FrameLayout 
       android:layout_height="wrap_content" 
       android:layout_width="0dp" 
       android:layout_weight="1"> 
       <ImageView android:layout_width="wrap_content" 
        android:layout_height="wrap_content" 
        android:src="@drawable/button_share_favorite_recipe" 
        android:id="@+id/buttonShareFavoriteRecipe" 
        android:onClick="onClickShareFavoriteRecipe" 
        android:layout_gravity="center_horizontal"> 
       </ImageView> 
       </FrameLayout> 
      </TableRow> 

    </TableLayout> 
+2

Dzięki stary! Pomogło mi to ... – krisDrOid

+1

To zadziałało dla mnie. Musiałem jednak dodać center_vertical do elementów FrameLayout. – Steven

24

W ten sposób formatuję równomiernie moje stoły. Nie jest częścią twojego pytania, ale obejmuje wszystkie kolumny android: layout_span = "2" na innych dzieciach TableRow, które nie zawierają atrybutu android: layout_column. Mam nadzieję że to pomoże.

<TableLayout 
    android:id="@+id/tableLayout1" 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:stretchColumns="0,1"> 

    <TableRow 
     android:id="@+id/tableRow1" 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content"> 

     <TextView 
      android:id="@+id/textView1" 
      android:layout_column="0"> 
     </TextView> 

     <TextView 
      android:id="@+id/textView2" 
      android:layout_column="1"> 
     </TextView> 

    </TableRow> 

</TableLayout> 
Powiązane problemy