Что эквивалентно «colspan» в Android TableLayout? - PullRequest
125 голосов
/ 26 апреля 2010

Я использую TableLayout в Android. Прямо сейчас у меня есть один TableRow с двумя элементами в нем, а под ним TableRow с одним элементом. Это выглядит так:

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

Я хочу сделать так, чтобы ячейка 3 растягивалась по обеим верхним ячейкам, поэтому она выглядит так:

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

В HTML я бы использовал COLSPAN .... как мне заставить это работать в Android?

Ответы [ 8 ]

187 голосов
/ 26 апреля 2010

Кажется, что есть атрибут, который делает это: layout_span

UPDATE: Этот атрибут должен быть применен к дочерним элементам TableRow. НЕ в самой TableRow.

87 голосов
/ 22 февраля 2012

Чтобы завершить ответ, атрибут layout_span должен быть добавлен к дочернему элементу, а не к TableRow.

Этот фрагмент показывает третью строку моего tableLayout, которая охватывает 2 столбца.

<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>
34 голосов
/ 04 октября 2012

И вот как вы делаете это программно

//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);
25 голосов
/ 23 октября 2014

Вы должны использовать layout_weight, чтобы заполнить всю строку, иначе он все еще заполняет левый или правый столбец макета таблицы.

<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>
5 голосов
/ 28 декабря 2012

Может быть, это кому-нибудь поможет. Я пробовал решение с layout_span, но это не работает для меня. Так что я решил проблему с помощью этого трюка. Просто используйте LinearLayout вместо TableRow там, где вам нужен кольспан, и все.

3 голосов
/ 16 декабря 2013

использовать android: layout_span в дочернем элементе элемента TableRow

1 голос
/ 29 ноября 2016

У меня были некоторые проблемы с rowspan, в случае TableRow, Textview и т. Д., Сгенерированных с кодом Даже если ответ Onimush кажется хорошим, он не работает с сгенерированным пользовательским интерфейсом.

Вот фрагмент кода, который .... не работает:

            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);

Код вроде бы в порядке, но когда вы достигаете инициализации "the_params", он возвращает NULL.

На другом конце этот код работает как шарм:

            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);

Единственное отличие состоит в том, что я помещаю Textview в TableRow перед установкой диапазона. И в этом случае это работает. Надеюсь, это кому-нибудь поможет!

0 голосов
/ 26 апреля 2010

Я думаю, вам нужно обернуть макет вокруг другого. Один список макетов должен располагаться вертикально, а другой - один (или в данном случае два) горизонтально.

Мне все еще трудно разделить интерфейс на 50-50 частей в Android.

...