Що таке еквівалент "colspan" в Android TableLayout?


132

Я використовую TableLayout в Android. Зараз у мене є один TableRow з двома елементами в ньому, і нижче, TableRow з одним елементом. Виводиться так:

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

Що я хочу зробити, це зробити, щоб Cell 3 розтягнувся на обидві верхні комірки, так що це виглядає приблизно так:

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

У HTML я використовую COLSPAN .... як зробити цю роботу в Android?


Імхо, я знаходжу кращий спосіб зробити це. Ось відповідь: stackoverflow.com/a/18682293/1979882
В’ячеслав

1
Для запису зауважте, що TableLayout по суті є LinearLayout. Це означає, що ви можете додати будь-яку дитину безпосередньо. Таким чином, для одного перегляду проміжків усіх стовпців ви можете пропустити TableRow.
ralfoide

Відповіді:


196

Здається, що існує такий атрибут: layout_span

ОНОВЛЕННЯ: Цей атрибут потрібно застосувати до дітей TableRow. НЕ до самого TableRow.


8
Так, це один. Однак, віджет макета Eclipse, здається, не знає про нього, оскільки не був вказаний серед доступних властивостей. Але це працює.
Спайк Вільямс

2
Ви знаєте, +1 для оновлення у відповіді. Я намагався з'ясувати, чому Eclipse не дає цієї опції на Ctrl + Space! : D;)
Нірав Завери

Я використовую layout_span на мій погляд. Тоді я не можу використовувати вагу на цьому погляді. Я повинен використовувати wrap_content. Чому?
eC Droid

93

Для завершення відповіді атрибут layout_span повинен бути доданий дитині, а не TableRow.

Цей фрагмент показує третій рядок мого табличного макета, який охоплює 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>

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

7
Вам також може знадобитися встановити params.weight = 1, щоб натягнутий вміст заповнив рядок.
rmirabelle

1
Це не працює. stackoverflow.com/a/18682293/1979882 Тут я написав пояснення.
В’ячеслав

7
Обов’язково спочатку додайте дитину до рядка.
Артем Калинчук

1
@DacSaunders Відповідь відкотується назад. Ваша редакція була конкретна для ваших потреб. Оригінальна відповідь є загальною для методу, і 31 великий палець вгору може сказати вам, можливо, ви робите щось не так? Дивіться також коментар Артема, який підкреслює, що дитину потрібно додати спочатку. У childцьому випадку може бути що завгодно, не лише перегляд тексту, як пропонувало ваше редагування. Спасибі
Онімуша

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>

3
Дякую. Ця інформація була відсутньою для дрібних або гнучких елементів, у моєму випадку Spinner.
chksr

5

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


1
І це не повинно бути LinearLayout. Я поставив просто вид, як хотів.
JPMagalhaes

3

використовувати android: layout_span в дочірньому елементі елемента TableRow


1

У мене виникли проблеми з rowspan, у випадку TableRow, Textview тощо, що генерується з кодом. Навіть якщо відповідь Онімуша здається гарною, вона не працює з створеним інтерфейсом.

Ось фрагмент коду, який .... не працює:

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

Здається, що з кодом все гаразд, але, коли ви доходите до init "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.


Я в кінцевому підсумку робив це, щоб обійти іншу помилку, пов’язану з таблицею, яка з невідомих причин приховувала 1/3 мого макета в ландшафтному режимі.
Спайк Вільямс
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.