TableLayout 是以行和列显示子级 View 元素的 ViewGroup

注意:为获得更好的性能和工具支持,您应该改为使用 ConstraintLayout 构建布局

TableLayout 将其子级放置在行和列中。TableLayout 容器不显示行、列或单元格的边框线。表格的大多数单元格具有相同的列数和行数。表格可以将单元格留空。单元格可以跨多个列,就像在 HTML 中一样。您可以使用 TableRow.LayoutParams 类中的 span 字段来跨列。

注意:单元格不能跨多个行。

TableRow 对象是 TableLayout 的子视图(每个 TableRow 定义表格中的一行)。每行包含零个或多个单元格,每个单元格均由任何一种其他 View 定义。因此,行的单元格可能包含各种 View 对象,如 ImageView 或 TextView 对象。单元格也可以是 ViewGroup 对象(例如,您可以将另一个 TableLayout 作为单元格进行嵌套)。

以下示例布局包含两行,每行包含两个单元格。随附的屏幕截图显示了结果,单元格边框显示为虚线(为视觉效果而添加)。

<?xml version="1.0" encoding="utf-8"?>
<TableLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:stretchColumns="1">
    <TableRow>
        <TextView
            android:text="@string/table_layout_4_open"
            android:padding="3dip" />
        <TextView
            android:text="@string/table_layout_4_open_shortcut"
            android:gravity="right"
            android:padding="3dip" />
    </TableRow>

    <TableRow>
        <TextView
            android:text="@string/table_layout_4_save"
            android:padding="3dip" />
        <TextView
            android:text="@string/table_layout_4_save_shortcut"
            android:gravity="right"
            android:padding="3dip" />
    </TableRow>
</TableLayout>

列可以隐藏,标记为拉伸并填充可用的屏幕空间,也可以标记为可收缩以强制收缩列,直至表格适合屏幕。如需了解详情,请参阅 TableLayout reference 文档。

示例

  1. 启动一个名为“HelloTableLayout”的新项目。
  2. 打开 res/layout/main.xml 文件并插入以下代码:
    <?xml version="1.0" encoding="utf-8"?>
    <TableLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:stretchColumns="1">
    
        <TableRow>
            <TextView
                android:layout_column="1"
                android:text="Open..."
                android:padding="3dip" />
            <TextView
                android:text="Ctrl-O"
                android:gravity="right"
                android:padding="3dip" />
        </TableRow>
    
        <TableRow>
            <TextView
                android:layout_column="1"
                android:text="Save..."
                android:padding="3dip" />
            <TextView
                android:text="Ctrl-S"
                android:gravity="right"
                android:padding="3dip" />
        </TableRow>
    
        <TableRow>
            <TextView
                android:layout_column="1"
                android:text="Save As..."
                android:padding="3dip" />
            <TextView
                android:text="Ctrl-Shift-S"
                android:gravity="right"
                android:padding="3dip" />
        </TableRow>
    
        <View
            android:layout_height="2dip"
            android:background="#FF909090" />
    
        <TableRow>
            <TextView
                android:text="X"
                android:padding="3dip" />
            <TextView
                android:text="Import..."
                android:padding="3dip" />
        </TableRow>
    
        <TableRow>
            <TextView
                android:text="X"
                android:padding="3dip" />
            <TextView
                android:text="Export..."
                android:padding="3dip" />
            <TextView
                android:text="Ctrl-E"
                android:gravity="right"
                android:padding="3dip" />
        </TableRow>
    
        <View
            android:layout_height="2dip"
            android:background="#FF909090" />
    
        <TableRow>
            <TextView
                android:layout_column="1"
                android:text="Quit"
                android:padding="3dip" />
        </TableRow>
    </TableLayout>
    

    请注意它与 HTML 表格结构的相似之处。TableLayout 元素类似于 HTML <table>元素;TableRow 类似于 ><tr>> 元素;但是对于单元格,您可以使用任何一种 View 元素。在此示例中,每个单元格都使用了 TextView。在某些行之间,还有一个基本 View,用于绘制水平线。

  3. 请确保 HelloTableLayout Activity 在 onCreate() 方法中加载此布局:

    Kotlin

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.main)
    }
    

    Java

    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
    }
    

    setContentView(int) 方法会加载 Activity 的布局文件(由资源 ID 指定),R.layout.main 是指 res/layout/main.xml 布局文件。

  4. 运行应用。

您应该会看到以下内容: