Android TableLayout中的“ colspan”等效项是什么?


132

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

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

我想要做的是使Cell 3延伸到两个上方的单元格,所以看起来像这样:

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

在HTML中,我将使用COLSPAN ....如何在Android中实现此功能?


恕我直言,我寻求更好的方法来做到这一点。答案在这里: stackoverflow.com/a/18682293/1979882
Vyacheslav

1
作为记录,请注意TableLayout本质上是LinearLayout。这意味着您可以直接添加任何子级。因此,对于单个全列跨度视图,可以跳过TableRow。
ralfoide

Answers:


196

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

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


8
是的,这是一个。但是,Eclipse布局小部件似乎并不了解它,因为它未在可用属性中列出。但这确实有效。
斯派克·威廉姆斯

2
您知道,+ 1是您的答案更新。我试图找出为什么Eclipse在Ctrl + Space上没有给出该选项的原因!:D;)
Nirav Zaveri 2014年

我在视图上使用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>

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以使跨区内容填充行。
rmir​​abelle

1
没用 stackoverflow.com/a/18682293/1979882在这里,我写了解释。
Vyacheslav

7
确保首先将孩子添加到该行。
Artem Kalinchuk

1
@DacSaunders答案回滚。您的修改是针对您的需要的。该方法的原始答案是通用的,并且31个大拇指可能会告诉您,也许您做错了什么?另请参阅Artem的评论,该评论强调需要首先添加孩子。在child这种情况下可以是任何东西,而不仅仅是作为TextView的您的编辑建议。谢谢
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>

3
谢谢。这是小型或柔性元件(在我的情况下为Spinner)缺少的信息。
chksr '16

5

也许这会帮助某人。我尝试了解决方案,layout_span但这对我不起作用。所以我用这个技巧解决了问题。仅LinearLayoutTableRow需要colspan的地方使用,就是这样。


1
而且它不必是LinearLayout。我只想提出一个观点。
JPMagalhaes 2013年


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


0

我认为您需要在另一种布局周围进行包装。垂直放置一个布局列表,水平放置另一个列表(在这种情况下为两个)。

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


我最终这样做是为了解决与表相关的其他错误,由于未知原因,该错误导致我的布局的1/3隐藏在横向模式下。
斯派克·威廉姆斯
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.