Jaki jest odpowiednik „colspan” w układzie tabel systemu Android?

132

Używam TableLayout w systemie Android. W tej chwili mam jeden TableRow z dwoma elementami, a poniżej TableRow z jednym elementem. Renderuje tak:

-----------------------------
|   Cell 1    |  Cell 2     |
-----------------------------
|   Cell 3    |
---------------

Chcę, aby Cell 3 rozciągnął się w obu górnych komórkach, więc wygląda to tak:

-----------------------------
|   Cell 1    |  Cell 2     |
-----------------------------
|           Cell 3          |
-----------------------------

W HTML użyłbym COLSPAN… jak to zrobić w Androidzie?

Spike Williams
źródło
Imho, znajduję lepszy sposób na zrobienie tego. Tutaj odpowiedź: stackoverflow.com/a/18682293/1979882
Wiaczesław
1
Dla przypomnienia, zauważ, że TableLayout jest zasadniczo LinearLayout. Oznacza to, że możesz bezpośrednio dodać dowolne dziecko. Tak więc w przypadku pojedynczego widoku obejmującego wszystkie kolumny można pominąć TableRow.
ralfoide

Odpowiedzi:

198

Wygląda na to, że istnieje atrybut, który to robi: layout_span

UPDATE: ten atrybut należy zastosować do elementów podrzędnych TableRow. NIE do samego TableRow.

Sephy
źródło
8
Tak, to jest ten. Widżet układu Eclipse nie wydaje się jednak o tym wiedzieć, ponieważ nie został wymieniony na liście dostępnych właściwości. Ale to działa.
Spike Williams
2
Wiesz, +1 za swoją aktualizację w odpowiedzi. Próbowałem się dowiedzieć, dlaczego Eclipse nie daje tej opcji na Ctrl + Spacja! : D;)
Nirav Zaveri
Używam layout_span w moim widoku. W takim razie nie mogę użyć ciężaru na tym widoku. Muszę użyć wrap_content. Czemu?
eC Droid
93

Aby uzupełnić odpowiedź, atrybut layout_span należy dodać do elementu podrzędnego, a nie do TableRow.

Ten fragment kodu pokazuje trzeci wiersz mojego tableLayout, który obejmuje dwie kolumny.

<TableLayout>
    <TableRow
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" >

        <Button
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_span="2"
            android:text="@string/create" />
    </TableRow>
</TableLayout>
Maragues
źródło
38

I tak robisz to programowo

//theChild in this case is the child of TableRow
TableRow.LayoutParams params = (TableRow.LayoutParams) theChild.getLayoutParams();
params.span = 2; //amount of columns you will span
theChild.setLayoutParams(params);
Onimusha
źródło
7
Konieczne może być również ustawienie params.weight = 1, aby łączona zawartość wypełniła wiersz.
rmirabelle
1
To nie działa. stackoverflow.com/a/18682293/1979882 Tutaj napisałem wyjaśnienie.
Wiaczesław
7
Pamiętaj, aby najpierw dodać dziecko do wiersza.
Artem Kalinchuk
1
@DacSaunders Odpowiedź wycofana. Twoja zmiana była dostosowana do Twoich potrzeb. Oryginalna odpowiedź jest ogólna dla metody i 31 kciuków w górę może powiedzieć, że może robisz coś złego? Zobacz również komentarz Artema, który podkreśla, że ​​dziecko musi zostać dodane jako pierwsze. W childtym przypadku może to być wszystko, a nie tylko widok tekstu, jak sugerowała Twoja edycja. Dzięki
Onimusha
27

Musisz użyć layout_weight, aby wypełnić cały wiersz, w przeciwnym razie nadal wypełnia lewą lub prawą kolumnę układu tabeli.

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

        <Button
            android:id="@+id/button1"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_span="2"
            android:layout_weight="1"
            android:text="ClickMe" />

    </TableRow>
Raghavendra
źródło
3
Dziękuję Ci. To była brakująca informacja dla małych lub elastycznych elementów, w moim przypadku Spinner.
chksr
5

Może to komuś pomoże. Wypróbowałem rozwiązanie, layout_spanale to nie działa. Więc rozwiązałem problem tą sztuczką. Po prostu użyj LinearLayoutw miejscu, w TableRowktórym potrzebujesz colspana, to wszystko.

Dimanoid
źródło
1
I nie musi to być układ liniowy. Umieściłem tylko widok, tak jak chciałem.
JPMagalhaes
3

użyj android: layout_span w elemencie potomnym elementu TableRow

Mosiur
źródło
1

Miałem problem z rowspanami, w przypadku TableRow, Textview i tak dalej, generowanych za pomocą kodu. Nawet jeśli odpowiedź Onimush wydaje się być dobra, nie działa z wygenerowanym interfejsem użytkownika.

Oto fragment kodu, który ... nie działa:

            TableRow the_ligne_unidade = new TableRow(this);
            the_ligne_unidade.setBackgroundColor(the_grey);

            TextView my_unidade = new TextView(this);
            my_unidade.setText(tsap_unidade_nom);
            my_unidade.setTextSize(20);
            my_unidade.setTypeface(null, Typeface.BOLD);
            my_unidade.setVisibility(View.VISIBLE);

            TableRow.LayoutParams the_param;
            the_param = (TableRow.LayoutParams)my_unidade.getLayoutParams();
            the_param.span = 3;
            my_unidade.setLayoutParams(the_param);

            // Put the TextView in the TableRow
            the_ligne_unidade.addView(my_unidade);

Kod wydaje się być w porządku, ale kiedy dojdziesz do init "the_params", zwraca NULL.

Z drugiej strony ten kod działa jak urok:

            TableRow the_ligne_unidade = new TableRow(this);
            the_ligne_unidade.setBackgroundColor(the_grey);

            TextView my_unidade = new TextView(this);
            my_unidade.setText(tsap_unidade_nom);
            my_unidade.setTextSize(20);
            my_unidade.setTypeface(null, Typeface.BOLD);
            my_unidade.setVisibility(View.VISIBLE);

            // Put the TextView in the TableRow
            the_ligne_unidade.addView(my_unidade);

            // And now, we change the SPAN
            TableRow.LayoutParams the_param;
            the_param = (TableRow.LayoutParams)my_unidade.getLayoutParams();
            the_param.span = 3;
            my_unidade.setLayoutParams(the_param);

Jedyną różnicą jest to, że przed ustawieniem zakresu umieszczam Textview wewnątrz TableRow. I w tym przypadku to działa. Mam nadzieję, że to komuś pomoże!

Piotr
źródło
0

Myślę, że musisz owinąć układ wokół innego. Miej jedną listę układów pionowo, wewnątrz inną (lub w tym przypadku dwie) listę poziomą.

Wciąż trudno mi ładnie podzielić interfejs na 50-50 części w Androidzie.

RobGThai
źródło
Skończyło się na tym, że zrobiłem to, aby ominąć inny błąd związany z tabelą, który powodował, że 1/3 mojego układu była ukryta w trybie poziomym z nieznanych powodów.
Spike Williams