139

我在 Android 中使用 TableLayout。现在我有一个包含两个项目的 TableRow,在它下面,一个包含一个项目的 TableRow。它呈现如下:

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

我想要做的是让 Cell 3 横跨两个上部单元格,所以它看起来像这样:

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

在 HTML 中我会使用 COLSPAN .... 我如何在 Android 中进行这项工作?

4

9 回答 9

205

似乎有一个属性可以做到这一点: layout_span

更新:此属性必须应用于 TableRow 的子项。不是 TableRow 本身。

于 2010-04-26T12:17:33.730 回答
96

只是为了完成答案,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>
于 2012-02-22T10:03:07.480 回答
41

这就是您以编程方式执行此操作的方式

//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);
于 2012-10-04T09:33:24.400 回答
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>
于 2014-10-23T12:29:05.317 回答
5

也许这会对某人有所帮助。我尝试了解决方案,layout_span但这对我不起作用。所以我用这个技巧解决了这个问题。只需在需要 colspanLinearLayout的地方使用,仅此而已。TableRow

于 2012-12-28T15:35:40.543 回答
3

在 TableRow 元素的子元素中使用 android:layout_span

于 2013-12-16T07:39:16.540 回答
1

其实这很简单。这是我以编程方式的解决方案

        TableLayout tableLayout = binding.tableLayout;
        TableRow row = new TableRow(this);
        TableRow.LayoutParams layoutParams = new TableRow.LayoutParams(TableRow.LayoutParams.WRAP_CONTENT);
        layoutParams.span = 4;               // define no. of column span will row do
        row.setLayoutParams(layoutParams);

        TextView noDataTextView = new TextView(this);
        noDataTextView.setText("No Data");
        noDataTextView.setGravity(Gravity.CENTER);
        noDataTextView.setLayoutParams(layoutParams);   //This line will span your row

        row.addView(noDataTextView);
        tableLayout.addView(row, 1);
于 2021-11-07T02:41:37.973 回答
1

在使用代码生成的 TableRow、Textview 等的情况下,我在行跨度方面遇到了一些问题。即使 Onimush 的回答看起来不错,它也不适用于生成的 UI。

这是一段代码......不起作用:

            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 内。在这种情况下,它可以工作。希望这会对某人有所帮助!

于 2016-11-29T00:31:30.077 回答
0

我认为您需要围绕另一个布局进行布局。有一个垂直的布局列表,里面有另一个(或者在这种情况下,两个)水平的列表。

我仍然发现很难在 Android 中很好地将界面拆分为 50-50 部分。

于 2010-04-26T04:03:17.877 回答