Что эквивалентно слову «colspan» в Android TableLayout?

132

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

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

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

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

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

Спайк Уильямс
источник
Imho, я нашел лучший способ сделать это. Вот ответ: stackoverflow.com/a/18682293/1979882
Вячеслав
1
Для записи обратите внимание, что TableLayout по сути является LinearLayout. Это означает, что вы можете напрямую добавить любого ребенка. Таким образом, для одного представления со всеми столбцами вы можете пропустить TableRow.
ralfoide 02 фев.15,

Ответы:

196

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

ОБНОВЛЕНИЕ: этот атрибут должен применяться к дочерним элементам TableRow. НЕ к самой TableRow.

Sephy
источник
8
Ага, это тот самый. Однако виджет компоновки Eclipse, похоже, не знает об этом, поскольку он не был указан среди доступных свойств. Но это работает.
Спайк Уильямс,
2
Вы знаете, +1 за ваше обновление в ответе. Я пытался выяснить, почему Eclipse не предоставляет эту возможность для Ctrl + Space! : D;)
Нирав Завери
Я использую layout_span в своем представлении. Тогда я не могу использовать вес в этом ракурсе. Мне нужно использовать wrap_content. Зачем?
eC Droid
93

Чтобы завершить ответ, атрибут 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>
Maragues
источник
36

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

//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
источник
7
Вам также может потребоваться установить params.weight = 1, чтобы составной контент заполнял строку.
rmirabelle
1
Не работает stackoverflow.com/a/18682293/1979882 Здесь я написал объяснение.
Вячеслав
7
Обязательно сначала добавьте ребенка в строку.
Артем Калинчук
1
Откат ответа @DacSaunders. Ваше редактирование было специально для вас. Исходный ответ является общим для метода, и 31 большой палец вверх может сказать вам, что вы делаете что-то не так? См. Также комментарий Артема, в котором подчеркивается, что сначала нужно добавить ребенка. В childэтом случае может быть что угодно, а не только текстовое представление, как было предложено вашим редактированием. Спасибо
Onimusha
27

Вы должны использовать 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>
Raghavendra
источник
3
Спасибо. Это была недостающая информация для небольших или гибких элементов, в моем случае Spinner.
chksr 07
5

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

Dimanoid
источник
1
И это не обязательно должно быть LinearLayout. Ставил просто вид, как хотел.
JPMagalhaes
3

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

Mosiur
источник
1

У меня была проблема с 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

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

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

RobGThai
источник
В итоге я сделал это, чтобы обойти другую ошибку, связанную с таблицами, из-за которой по неизвестным причинам 1/3 моего макета скрывалась в альбомном режиме.
Спайк Уильямс,