![Hello HarmonyOS!:鸿蒙应用开发从入门到精通](https://wfqqreader-1252317822.image.myqcloud.com/cover/437/43738437/b_43738437.jpg)
2.2.4 TableLayout
TableLayout是一种表格布局,将页面分为多个单元格,以行、列单元格的形 式 来 管 理 子 组 件,其 最 基 本 的 两 个 属 性 是 ohos:row_count 和ohos:column_count,分别代表行数和列数。图2-23所示为ohos:row_count=3,ohos:column_count=3 的表格布局。在 TableLayout 中,组件的排列方向ohos:orientation属性指定了组件在排列时,是按垂直方向排列还是按水平方向排列。
![](https://epubservercos.yuewen.com/0FFABF/23020655009774306/epubprivate/OEBPS/Images/42868_109_1.jpg?sign=1738988579-psqCYsyIT7dWEOjP98Av8IY70HLVEea0-0-c6a90a0dc6dfcbbe2ca62eb53795fa49)
图2-23 表格布局示意图
TableLayout有以下特有的属性,见表2-4。
表2-4 TableLayout的属性
![](https://epubservercos.yuewen.com/0FFABF/23020655009774306/epubprivate/OEBPS/Images/42868_109_2.jpg?sign=1738988579-3lDV4kMcDZSjwXqi2dXJMEnP2zVPhMrx-0-fef5427ce47b4202fab4e626d5219c20)
下面来看一些具体问题,首先设置表格的属性。
![](https://epubservercos.yuewen.com/0FFABF/23020655009774306/epubprivate/OEBPS/Images/42868_109_3.jpg?sign=1738988579-DPpzyQifBOXFhwxOkOxPB37fOZxaPiK3-0-f9af3f331b2a393e5944954d7c6d0e34)
在上述代码中,表格设置的是水平排列,column_count 设置为 1,表示TableLayout只有一列,然后在TableLayout中添加3个组件。
![](https://epubservercos.yuewen.com/0FFABF/23020655009774306/epubprivate/OEBPS/Images/42868_110_1.jpg?sign=1738988579-MBwqo4pNK7g3bbumJFttQTp6SEOu8Hun-0-e05b19f0bbd6aef9b308605245c84934)
页面的预览效果如图2-24所示。
![](https://epubservercos.yuewen.com/0FFABF/23020655009774306/epubprivate/OEBPS/Images/42868_110_2.jpg?sign=1738988579-7DoyovgcQkcxKmD9rR2pYyPQla1MuqfO-0-0aa9d683c67ee2ebdffb03381d71ad77)
图2-24 表格布局的单列演示
虽然TableLayout的排列方向设置为水平,但实际效果是组件排成一列。虽然设置了水平排列,B 组件的位置应该在 A 组件的右侧,但由于TableLayout 设置的列数为 1,意思是每一行只有一列。所以,A组件的右侧已经没有位置了,B组件只能被绘制到第二行。同理,C组件的位置也是这样确定的。
现在把列数设置为2,在TableLayout中放入5个组件。
![](https://epubservercos.yuewen.com/0FFABF/23020655009774306/epubprivate/OEBPS/Images/42868_111_1.jpg?sign=1738988579-eQSOvofnmF9QNkWxV1VxCdQo5xkStDUq-0-f16b702e50c34e056cba72a5f18f89e1)
![](https://epubservercos.yuewen.com/0FFABF/23020655009774306/epubprivate/OEBPS/Images/42868_112_1.jpg?sign=1738988579-ORjP3DNmOtBu1jnTAq99u7u1WkgpJpHR-0-0130b878f0e43f3087e84e04e1c1266f)
页面的预览效果如图2-25所示。
设置 ohos:column_count="2"的含义是,每一行最多可以放两个组件,多的组件只能放到下一行,比如在上述例子中,组件的第一行分别是A、B组件,C组件排到了第二行。
![](https://epubservercos.yuewen.com/0FFABF/23020655009774306/epubprivate/OEBPS/Images/42868_112_2.jpg?sign=1738988579-aoknWaKZv2K6u6WLjQwPPgspv76NLOHO-0-996746a8169625bda98ee3c22e49d107)
图2-25 表格布局的多列演示
细心的读者可能发现,在TableLayout的属性中,还加入了 ohos:row_count="2",声明了TableLayout 有两行,但很明显,这个属性值并未起作用,因为第五个组件 E被放到了第三行,可以理解为,当表格的方向设置为水平时,它的ohos:row_count 属性不起作用。根据对偶性,当表格的方向设置为垂直时,ohos:column_count属性不起作用。TableLayout的排列方向默认为水平。
TableLayout还有另一个属性alignment_type,它有两个子属性:边距对齐“align_contents”、边界对齐“align_edges”,默认为“align_contents”。下面来测试这两个属性的效果。
![](https://epubservercos.yuewen.com/0FFABF/23020655009774306/epubprivate/OEBPS/Images/42868_112_3.jpg?sign=1738988579-HTlToOBuiMtNKoB2RlqtfqtU9Vu8nuyc-0-7f737d8f7fca5fd54670866337190100)
![](https://epubservercos.yuewen.com/0FFABF/23020655009774306/epubprivate/OEBPS/Images/42868_113_1.jpg?sign=1738988579-usHGOLuwA7lCM6SuOqsOKQ1msDnGMDUo-0-02d02fcf62257a75f98e04028f5320eb)
在TableLayout中摆放三个组件,对齐方式为边距对齐“align_contents”。其中,A组件加了外边距20vp,B组件和C组件都没有加外边距。页面的预览效果如图2-26所示。
我们可以很清晰地看到A组件四周的外边距。B组件由于没有外边距,紧贴着 A 组件右侧外边距的位置和屏幕顶部来绘制。C 组件紧贴屏幕左侧和 A组件下侧外边距来绘制。但是当给C组件一个比A组件大的外边距时,B组件左侧的参考位置就发生了变化。我们看一下下面的例子。
![](https://epubservercos.yuewen.com/0FFABF/23020655009774306/epubprivate/OEBPS/Images/42868_113_2.jpg?sign=1738988579-ze7xBsknhUlUURVb80wUhNoslCtPQJ1N-0-de3e845b156b761d3e82574881e3b98c)
![](https://epubservercos.yuewen.com/0FFABF/23020655009774306/epubprivate/OEBPS/Images/42868_114_1.jpg?sign=1738988579-OzhryYy5oDim4MjIlpTwUtQwwpx1nVhd-0-52c754a6dc4fa22e6cfecc39fad46f4d)
这个案例和上面案例的不同点在于,C组件的外边距被设置为50vp,明显比A组件的外边距20vp要大。那么在绘制B组件时,B组件左侧紧贴的不再是 A 组件右侧的外边距,而是边距更大的 C 组件右侧的外边距,页面的预览效果如图 2-27 所示,这就是边距对齐的含义。在这种方式下,组件的边距值确定了组件所占的矩形区域大小。对于表格布局,上下排列的表格大小是一样的,如果下方表格比上方表格大,那么自然就会把上方的表格撑开,在垂直方向上也是一样的。
![](https://epubservercos.yuewen.com/0FFABF/23020655009774306/epubprivate/OEBPS/Images/42868_114_2.jpg?sign=1738988579-XYCDfElDKGDljs2dVNI5d8j6d1p3mOrN-0-09f07bcdbe053faa769555faeaec903b)
图2-26 表格布局的边距对齐“align_contents”的效果
![](https://epubservercos.yuewen.com/0FFABF/23020655009774306/epubprivate/OEBPS/Images/42868_114_3.jpg?sign=1738988579-eo2ePDxCtuhZ7x67M9275p5LsNNbaOz6-0-95f52e2c65ae7c09c003e3d19a295035)
图2-27 表格布局的修改组件的边距效果
把TableLayout的对齐方式改为align_edges,其他都不做改动。
![](https://epubservercos.yuewen.com/0FFABF/23020655009774306/epubprivate/OEBPS/Images/42868_115_1.jpg?sign=1738988579-5p7JtZINo8x9xlHJnjSiPxch65wubIn2-0-e71553de10ede60da41350a9bcc853f7)
页面的预览效果如图2-28所示。
在边界对齐的方式下,B组件虽然没有边距,但B组件的上边界和A组件的上边界对齐了,A组件的左边界也和C组件的左边界对齐了,在行和列两个方向上取外边距最大的组件的外边距作为其他组件绘制时的外边距,从而将边界进行“对齐”。
![](https://epubservercos.yuewen.com/0FFABF/23020655009774306/epubprivate/OEBPS/Images/42868_115_2.jpg?sign=1738988579-C7PUQmN3mhxTWkvZMLqn9q6JhAv2hXq7-0-981dafa328e3f2ec0e35b313d9af55a8)
图2-28 表格布局的边界对齐“align_edges”的效果
实现TableLayout的Java代码如下。
![](https://epubservercos.yuewen.com/0FFABF/23020655009774306/epubprivate/OEBPS/Images/42868_115_3.jpg?sign=1738988579-zksz0GdC7ZudkSvgR2ItCloxHbRdYK3U-0-15da7482b63c9e2b6152447894e75dfc)
Button 通 过 TableLayout.LayoutConfig 的Specification 对象来为行和列进行设置,其中TableLayout.specification包含多个重载方法。
TableLayout.Specification specification(int start,float weight)
TableLayout.Specification specification(int start,int size)
TableLayout.Specification specification(int start,int size,float weight)
TableLayout.Specification specification(int start,int size,int alignment)
TableLayout.Specification specification(int start,int size,int alignment,float weight)
其中,start为起始行(列)的索引,从0开始计数。size是跨行(列)的数量,如果为 1,那么代表不跨行(列)。weight 为组件所在位置的权重值。alignment是组件的对齐方式。